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

3 投票
2 回答
814 浏览
提问于 2025-04-16 14:54

根据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):
   ...

撰写回答