Django - 在视图中检测移动设备

Chr*_*fer 8 django

我已经在我的模板中使用设备检测(http://djangosnippets.org/snippets/2228/)并尝试使其在视图中工作,因此如果用户来自iPhone,我可以重定向到应用商店.

所以我已经:

import re

def mobile(request):

    device = {}

    ua = request.META.get('HTTP_USER_AGENT', '').lower()

    if ua.find("iphone") > 0:
        device['iphone'] = "iphone" + re.search("iphone os (\d)", ua).groups(0)[0]

    if ua.find("ipad") > 0:
        device['ipad'] = "ipad"

    if ua.find("android") > 0:
        device['android'] = "android" + re.search("android (\d\.\d)", ua).groups(0)[0].translate(None, '.')

    # spits out device names for CSS targeting, to be applied to <html> or <body>.
    device['classes'] = " ".join(v for (k,v) in device.items())

    return {'device': device }
Run Code Online (Sandbox Code Playgroud)

然后在tools/middleware.py中创建了一个类:

from tools.context_processor import mobile

class detect_device(object):

    def process_request(self, request):
        device = mobile(request)

        request.device = device
Run Code Online (Sandbox Code Playgroud)

在settings.py中将以下内容添加到MIDDLEWARE_CLASSES:

'tools.middleware.detect_device'
Run Code Online (Sandbox Code Playgroud)

在views.py中,我创建了:

def get_link(request):
    if request.device.iphone:
        app_store_link = settings.APP_STORE_LINK
        return HttpResponseRedirect(app_store_link)
    else:
        return HttpResponseRedirect('/')
Run Code Online (Sandbox Code Playgroud)

但是我收到了错误:

'dict'对象没有属性'iphone'

san*_*lto 8

这是一本字典,而不是一堂课.

完整视图:

def get_link(request):
    if 'iphone' in request.device['device']:
        app_store_link = settings.APP_STORE_LINK
        return HttpResponseRedirect(app_store_link)
    else:
        return HttpResponseRedirect('/')
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,几乎是正确的,但是如果你将改变为 - 如果'iphone'在request.device ['device'] - 那么我会投票给你:) (2认同)