在Django站点框架中避免移动/桌面冗余代码
根据Django的文档,服务于移动和桌面应用的最佳做法似乎是这样的:
views.py
from django.contrib.sites.models import Site
def my_view(request):
current_site = Site.objects.get_current()
if current_site.domain == 'foo.com':
# Render desktop home page
elif current_site.domain == 'm.foo.com':
# Render mobile home page
不幸的是,这意味着我在每个视图中都要做if/then的选择。有没有可能我可以这样做:
views.py
from django.contrib.sites.models import Site
current_site = Site.objects.get_current()
if current_site.domain == 'foo.com':
def my_view(request):
# Render desktop home page
elif current_site.domain == 'm.foo.com':
def my_view(request):
# Render mobile home page
在我开始费劲地修改我的views.py文件之前,我想先了解一下这个想法的可行性。
2 个回答
1
你可以使用中间件来判断请求是否来自'm'这个子域名,然后指定正确的URL配置,这样就能把你引导到想要的视图。为了实现这个功能,我一直在使用一个修改过的django-subdomains
应用,它运行得很好。如果你的移动网站的视图逻辑和普通网站的视图逻辑差别很大,这个方法既简单又有效。这里是链接:
https://github.com/tkaemming/django-subdomains
接下来,你只需要为你的移动网站写一个新的URL配置,在设置中指定它,然后像为普通应用一样为移动网站编写视图和模板。
2
你有没有看过这个应用:http://pypi.python.org/pypi/django-mobility?
使用中间件来检测设备,以及使用装饰器根据不同设备切换模板,这是一种很好的方法,可以避免写很多重复的if/else判断。
而且如果你看看django-mobility提供的例子,它们看起来和你想要的结构非常相似:
def view(request):
...
@mobilized(view)
def view(request):
...