我做了一个Django网站,但我喝了Koolaid,我想制作一个iPhone版本.经过深思熟虑,我提出了两个选择:
制作一个完整的其他网站,例如i.xxxx.com.使用Django的站点框架将其绑定到同一个数据库中.
找一些读取用户代理的中间件,并动态更改模板目录.
不过,我真的更喜欢选项#2; 我有一些保留意见,主要是因为Django文档不鼓励动态更改设置.我找到了一个可以做我喜欢的片段.我的主要问题是让它尽可能无缝,我希望它对用户来说是自动化和透明的.
还有其他人遇到同样的问题吗?是否有人愿意分享他们如何解决制作iPhone版Django网站的问题?
更新
我使用了中间件和调整模板调用的组合.
对于中间件,我使用了minidetector.我喜欢它,因为它检测到过多的移动用户代理.我所要做的就是在我的视图中检查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')
如果不存在移动版本,则使用先前的自动回退到常规模板.
afarnham.. 20
您可以修改请求并添加一个值,让您的视图知道用户是否在iphone上,而不是动态更改模板目录.然后包装render_to_response(或者你用来创建HttpResponse对象的任何东西)来获取模板的iphone版本而不是标准的html版本,如果他们使用的是iphone.
您可以修改请求并添加一个值,让您的视图知道用户是否在iphone上,而不是动态更改模板目录.然后包装render_to_response(或者你用来创建HttpResponse对象的任何东西)来获取模板的iphone版本而不是标准的html版本,如果他们使用的是iphone.
检测中间件中的用户代理,切换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"
不要忘记将它添加到settings.py中的MIDDLEWARE_CLASSES:
MIDDLEWARE_CLASSES= [... 'yourproj.middleware.MobileMiddleware', ...]
创建一个移动urlconf,yourproj/mobile_urls.py:
urlpatterns=patterns('',('r'/?$', 'mobile.index'), ...)