gpt4 book ai didi

clojure, 活跃, 多站点

转载 作者:行者123 更新时间:2023-12-01 04:00:32 24 4
gpt4 key购买 nike

尝试根据 :server-name 在请求中返回的内容加载特定模板:

(ns rosay.views.common
(:use noir.core)
(:require [noir.request :as req]
[clojure.string :as string]
[net.cgrand.enlive-html :as html]))

(defn get-server-name
"Pulls servername for template definition"
[]
(or (:server-name (req/ring-request)) "localhost"))

(defn get-template
"Grabs template name for current server"
[tmpl]
(string/join "" (concat [(get-server-name) tmpl])))

(html/deftemplate base (get-template "/base.html")
[]
[:p] (html/content (get-template "/base.html")))

它适用于返回/home/usr/rosay/resources/localhost/base.html 的 localhost,但是当我针对不同的主机进行测试时说“hostname2”,我看到 get-template 在哪里查看/home/usr/rosay/resources/hostname2/base.html 但当它在浏览器中呈现时,它总是指向 ../resources/localhost/base.html。

是否有宏或不同的方式来处理这个用例?

最佳答案

正如评论中提到的,deftemplate是一个将模板定义为命名空间中的函数的宏 - 只有一次,当它第一次被评估时。您可以轻松地编写一些代码来懒惰地创建模板,并通过在创建模板后缓存模板来消除一些开销:

(def templates (atom {}))

(defmacro defservertemplate [name source args & forms]
`(defn ~name [& args#]
(let [src# (get-template ~source)]
(dosync
(if-let [template# (get templates src#)]
(apply template# args#)
(let [template# (template src# ~args ~@forms)]
(swap! templates assoc src# template#)
(apply template# args#)))))))

在您的情况下,您可以说 (defservertemplate base "/base.html"... .

你可以稍微整理一下。你真正需要知道的是 deftemplate只需调用 template ,如果你愿意,你可以直接使用它。

关于clojure, 活跃, 多站点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13772481/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com