Django在Settings.py中的TEMPLATE_DIRS调用unix样式斜杠。
因此,当我打电话
get_template('some/template.html')
在视图中,结果始终从根开始,并导致调用
/home/username/projectname/public/some/template.html
问题是我想使用托管在完全不同的网站上的模板。这适用于其他Settings.py字段(MEDIA_URL和STATIC_URL),它将采用绝对的http路径,没有异议。
给出一个http路径,
TEMPLATE_DIRS ('http://example.com/',)
在Settings.py中将强制
get_template('some/template.html')
试图找到
/home/username/projectname/public/http://example.com/some/template.html
我试图像这样绕过这个
TEMPLATE_DIRS ('../../../../http://example.com/',)
但是它仍然强制一个领先的斜杠,所以我得到了“/http://example.com”,这是没用的。
我的问题:
答案 0 :(得分:4)
您不需要使用模板目录。如果您有一个服务模板文件的服务器,您只需使用urllib2
远程获取它们,然后手动创建并呈现模板:
import urllib2
from django.template import Context, Template
tpl_html = urllib2.urlopen("http://mysite.com")
tpl = Template(tpl_html)
return tpl.render(Context({
'some_variable' : 'some_val',
})
如果要执行此操作,则必须包含一些缓存,对于使用此模板的每个请求,您都需要发出外部请求。或者,您可以将其写入自定义加载程序,但它将受到相同的限制。
答案 1 :(得分:3)
你不能这样做。
它与路径名无关。只是文件系统模板加载器需要从文件系统加载东西,因此名称。
这与MEDIA_URL的情况完全不同:它只是在HTML中添加一个路径,然后您的浏览器会加载该路径。 Django并不关心该文件的存在位置:虽然实际情况恰恰相反,但是如果你传递一个不是URL的文件路径(即由某个网络服务器提供服务),它根本就不起作用。
现在,您可以编写一个模板加载器,从另一台服务器获取其模板。模板加载器是可插拔的 - 您只需要将新加载器的名称放在TEMPLATE_LOADERS设置中。加载器本身需要使用urllib.urlopen
之类的东西从外部服务器获取模板。
但在你这样做之前要仔细考虑。这意味着每个模板请求现在都需要调用外部服务器才能提供页面。在扩展其他模板的模板的典型情况下,包括对包含的模板标签的调用,可能是五次或十次调用。并且,与媒体文件不同,它不能并行完成:在整个过程完成之前,页面将不会被提供。这可能会使您的网络服务器非常慢。
我不知道为什么你认为你需要这样做。模板是应用程序代码的一部分,因此它们通常与Python代码位于同一服务器上。如果你真的有理由将它们保留在外部,一种解决方案可能是通过像sshfs之类的东西将外部文件系统挂载到你的网络服务器上。尽管如此,它仍然可能非常缓慢。再想一想。
答案 2 :(得分:0)
一旦你完成了3,那么对2的回答将是肯定的 - 这是可行的 - 最终Django的模板语言并不关心它从何处获取文件,只要它的格式正确。
但是,它似乎是一种加载模板的效率非常低的方式,更有可能有更好的方法来实现相同的结果。