imj*_*uez 40 python django django-templates django-middleware mobile-website
我做了一个Django网站,但我喝了Koolaid,我想制作一个iPhone版本.经过深思熟虑,我提出了两个选择:
不过,我真的更喜欢选项#2; 我有一些保留意见,主要是因为Django文档不鼓励动态更改设置.我找到了一个可以做我喜欢的片段.我的主要问题是让它尽可能无缝,我希望它对用户来说是自动化和透明的.
还有其他人遇到同样的问题吗?是否有人愿意分享他们如何解决制作iPhone版Django网站的问题?
更新
我使用了中间件和调整模板调用的组合.
对于中间件,我使用了minidetector.我喜欢它,因为它检测到过多的移动用户代理.我所要做的就是在我的视图中检查request.mobile.
对于模板调用调整:
def check_mobile(request, template_name):
if request.mobile:
return 'mobile-%s'%template_name
return template_name
Run Code Online (Sandbox Code Playgroud)
我使用它来查看我知道我有两个版本的任何视图.
去做:
afa*_*ham 20
您可以修改请求并添加一个值,让您的视图知道用户是否在iphone上,而不是动态更改模板目录.然后包装render_to_response(或者你用来创建HttpResponse对象的任何东西)来获取模板的iphone版本而不是标准的html版本,如果他们使用的是iphone.
Ane*_*apu 12
检测中间件中的用户代理,切换url绑定,获利!
怎么样?Django请求对象具有.urlconf属性,可以由中间件设置.
来自django docs:
Django确定要使用的根URLconf模块.通常,这是ROOT_URLCONF设置的值,但如果传入的HttpRequest对象具有名为urlconf的属性(由中间件请求处理设置),则将使用其值代替ROOT_URLCONF设置.
在yourproj/middlware.py中,编写一个检查http_user_agent字符串的类:
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"
Run Code Online (Sandbox Code Playgroud)不要忘记将它添加到settings.py中的MIDDLEWARE_CLASSES:
MIDDLEWARE_CLASSES= [...
'yourproj.middleware.MobileMiddleware',
...]
Run Code Online (Sandbox Code Playgroud)创建一个移动urlconf,yourproj/mobile_urls.py:
urlpatterns=patterns('',('r'/?$', 'mobile.index'), ...)
Run Code Online (Sandbox Code Playgroud) 归档时间: |
|
查看次数: |
16612 次 |
最近记录: |