2011-03-20 82 views
1

不确定是否有人有过使用django专门为移动设备呈现模板的良好解决方案的经验。移动浏览器的django视图/模板重定向

我写了一个中间件请求处理器,使用正则表达式来检测它是否是移动浏览器。我现在正在请求上设置一个布尔属性,以便我可以在管道中使用它。但是我的业务逻辑是相同的,我只想使用一组不同的模板。

有没有办法让我在中间件处理器中为settings.TEMPLATE_DIRS添加一个新的模板目录,以便移动用户可以获得我选择重写的视图,但其他一切都会回退到默认模板目录。但我需要确保它不会在请求之间持续。

如果我添加了一个目录,设置是否会在请求之间持续保存?

..如果是这样,这是正确的解决方案(检查浏览器代理,添加一个额外的模板文件夹,然后在每个请求结束时删除它)?

回答

2

动态修改模板搜索路径是处理此问题的好方法。定义自己的模板加载器并将其添加到settings.py中的TEMPLATE_LOADERS并不难。其中棘手的部分是处理您可能在多线程环境中运行的事实,并且您没有办法将请求直接传递给模板加载器。

解决方法是将请求,标志或简单的目录存储到线程局部变量的路径中,并从自定义模板加载器中引用该线程局部变量。这里有一个关于创建模板加载器的blog post,我可以证实它非常简单并且可行。这里有一个even better one关于做你需要的东西。

我想我没有具体指出你可能不想尝试改变settings.TEMPLATE_DIRS每个请求,你会得到最好的结果。

+0

当我在load_template_source函数中时,我将如何访问局部变量?或者我如何设置一个本地变量,我可以在加载程序中访问 – MattoTodd 2011-03-20 04:25:06

+0

threadlocal实际上是一个全局变量,所以它“只是在那里”,但您可以确信只会获得与当前正在执行的请求相关的变量。这里有很多细节http://stackoverflow.com/questions/1057252/django-how-do-i-access-the-request-object-or-any-other-variable-in-a-forms-clea – easel 2011-03-20 04:27:52

+0

This博客文章有这一切。我将它添加到答案中。 http://opensource.washingtontimes.com/blog/2010/feb/17/loading-templates-based-request-headers-django/ – easel 2011-03-20 04:31:33