基于用户代理更改Django模板

2024-04-26 21:19:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我做了一个Django网站,但是我喝了koolide,我想做一个IPhone版本。经过深思熟虑,我想出了两个选择:

  1. 创建一个完整的其他网站,比如i.xxxx.com。使用Django的sites框架将其绑定到同一个数据库中。
  2. 找一段时间的中间件来读取用户代理,并动态更改模板目录。

不过,我确实更喜欢选项2;我有一些保留意见,主要是因为Django文档discourages changing settings on the fly。我找到了一个snippet可以做我想做的事情。我的主要问题是尽可能无缝,我希望它是自动的和透明的用户。

有没有其他人遇到同样的问题?有谁愿意分享一下他们是如何制作IPhone版本的Django网站的?

更新

我使用了中间件和调整模板调用的组合。

对于中间件,我使用minidetector。我喜欢它,因为它检测到一个plethora移动用户代理。我所要做的就是在我的视图中检查request.mobile。

对于模板调用调整:

 def check_mobile(request, template_name):
     if request.mobile:
         return 'mobile-%s'%template_name
     return template_name

我用这个来做任何我知道我有两个版本的视图。

待办事项:

  • 了解如何在扩展版的render_to_response中访问request.mobile,这样我就不必使用check_mobile('template_name.html')
  • 如果不存在移动版本,则使用以前的自动回退到常规模板。

Tags: 中间件django用户name版本视图模板代理
3条回答

您可以修改请求并添加一个值,让视图知道用户是否在iphone上,而不是动态更改模板目录。然后包装render_to_response(或用于创建HttpResponse对象的任何东西)以获取模板的iphone版本,而不是使用iphone的标准html版本。

在中间件中检测用户代理,切换url绑定,获利!

怎么做?Django请求对象有一个.urlconf属性,可以由中间件设置。

来自django docs:

Django determines the root URLconf module to use. Ordinarily, this is the value of the ROOT_URLCONF setting, but if the incoming HttpRequest object has an attribute called urlconf (set by middleware request processing), its value will be used in place of the ROOT_URLCONF setting.

  1. 在yourproj/middlware.py中,编写一个检查http_user_代理字符串的类:

    import re
    MOBILE_AGENT_RE=re.compile(r".*(iphone|mobile|androidtouch)",re.IGNORECASE)
    class MobileMiddleware(object):
        def process_request(self,request):
            if MOBILE_AGENT_RE.match(request.META['HTTP_USER_AGENT']):
                request.urlconf="yourproj.mobile_urls"
    
  2. 不要忘记将此添加到settings.py中的中间件类:

    MIDDLEWARE_CLASSES= [...
        'yourproj.middleware.MobileMiddleware',
    ...]
    
  3. 创建mobile urlconf,yourproj/mobile_urls.py:

    urlpatterns=patterns('',('r'/?$', 'mobile.index'), ...)
    

相关问题 更多 >