使用Django站点框架避免移动/桌面中的冗余代码

时间:2011-04-01 16:17:01

标签: python django mobile

根据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 个答案:

答案 0 :(得分:2)

您是否看过这个应用:http://pypi.python.org/pypi/django-mobility

使用中间件检测设备和装饰器根据传入设备切换模板是避免冗余if / else结构的好方法。

如果你看看为django-mobility提供的例子,它们看起来与你想要的结构非常相似:

def view(request):
    ...

@mobilized(view)
def view(request):
   ...

答案 1 :(得分:1)

您可以使用中间件检测请求是否属于“m”子域,然后指定正确的URL conf以指导您查看所需的视图。我一直在使用django-subdomains应用程序的修改版本,它一直很好用。如果您的移动网站的视图逻辑与常规网站的视图逻辑完全不同,则这是一种有效且简单的解决方案。这是链接:

https://github.com/tkaemming/django-subdomains

然后您要做的就是为您的移动网站写一个新的网址,在您的设置中指定,然后为您的移动网站编写您的观看/模板,就像您对常规应用一样。