8

Django's TEMPLATE_DIRS in Settings.py calls for unix style slashes.

Because of this, when I call

get_template('some/template.html')

in a view, the result always starts at the root, and results in a call to

/home/username/projectname/public/some/template.html

The problem is that I'd like to use templates hosted on an entirely different site. This works fine for other Settings.py fields (MEDIA_URL and STATIC_URL), where it will take an absolute http path with no objection.

Given an http path,

 TEMPLATE_DIRS ('http://example.com/',)

in Settings.py will force

get_template('some/template.html')

in a view to try and find

/home/username/projectname/public/http://example.com/some/template.html

I've tried to circumvent this like so

TEMPLATE_DIRS ('../../../../http://example.com/',)

But it still forces a leading slash, so I get "/http://example.com", which is useless.

My questions:

  1. Is there a way to trick this into pulling the template files from another server?
  2. Is that even feasible, given that the template files need to be processed for the view?
  3. Is it possible to create an alternate to 'django.template.loaders.filesystem.Loader' that doesn't call for unix style slashes?
4

3 回答 3

5

你不需要使用模板目录是你不想。如果您有一个正在提供模板文件的服务器,您可以简单地使用远程获取它们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',
})

如果要这样做,则必须合并一些缓存,因为对于使用此模板的每个请求,都需要发出外部请求。或者,您可以将其写入自定义加载程序,但它会受到相同的限制。

于 2011-11-20T11:48:47.243 回答
3

你不能这样做。

它与路径名无关。只是文件系统模板加载器需要从文件系统加载东西,因此得名。

这与 MEDIA_URL 的情况完全不同:它只是在您的 HTML 中添加一个路径,然后您的浏览器会加载该路径。Django 不关心该文件的位置:尽管实际上相反,如果您向它传递一个不是 URL 的文件路径(即由某处的网络服务器提供服务),它将根本无法工作。

现在,您可以编写一个从另一台服务器获取其模板的模板加载器。模板加载器是可插入的 - 您只需将新加载器的名称放在 TEMPLATE_LOADERS 设置中。加载器本身需要使用类似的东西urllib.urlopen从外部服务器获取模板。

但在你这样做之前要仔细考虑。这意味着现在每个模板请求都需要调用外部服务器才能提供页面。在扩展其他模板并包含对包含的模板标签的调用的模板的典型情况下,可能是五个或十个调用。而且,与媒体文件不同,它不能并行完成:在整个过程完成之前不会提供页面。这可能会使您的网络服务器非常非常慢。

我不知道你为什么认为你需要这样做。模板是您的应用程序代码的一部分,因此它们通常与您的 Python 代码位于同一台服务器上。如果您确实有理由将它们保留在外部,一种解决方案可能是通过sshfs之类的方式将外部文件系统安装到您的网络服务器上。不过,它仍然可能非常缓慢。再想想。

于 2011-11-20T11:46:36.927 回答
0
  1. 不 - 不可能通过 http 欺骗它从另一台服务器中提取文件
  2. 是的 - 你当然可以继承 django.template.loaders.filesystem.Loader (并通过适当地改变 load_template_source 方法),这样你就可以通过 http 加载模板

一旦你完成了 3,那么对 2 的答案就是肯定的——这将是可行的——最终 Django 的模板语言并不关心它从哪里获取文件,只要它的格式正确。

然而,这似乎是一种非常低效的加载模板的方式,更有可能有更好的方式来实现相同的结果。

于 2011-11-20T11:55:58.567 回答