2017-02-16 84 views
2

我正在努力寻找一种简单的方法来检测请求是否来自我的Django视图中的移动设备。使用Django和Python 3检测移动设备

我想实现这样的事情:

#views.py 

def myfunction(request): 

    ... 
    if request.mobile: 
     is_mobile = True 
    else: 
     is_mobile = False 

    context = { 
     ... , 
     'is_mobile': is_mobile, 
    } 
    return render(request, 'mytemplate.html', context) 

而且在mytemplate.html

{% if is_mobile %}  
    show something 
{% else %} 
    show something else 
{% endif %} 

我到处检查(例如herehere),minidetector建议。我已经安装了不同的版本:pip install minidetectorpip install minidetector2,以及直接夫妇GitHub的仓库,但他们都不是与Python 3

所以在这里,我的问题兼容:有minidetector的任何版本/前叉是兼容与Python 3?如果不是,有什么选择?

+0

有链接到一个无关紧要的问题AttributeError的。发布您的堆栈跟踪 – e4c5

+0

该链接旨在显示minidetector与Python 3不兼容。为了避免对该问题本身造成混淆,我已将其删除并重新说明了该部分。 – J0ANMM

回答

5

Django User Agents包是使用Python 3

按照上面提供的链接安装说明兼容,那么你可以按如下方式使用它:

def my_view(request): 

    # Let's assume that the visitor uses an iPhone... 
    request.user_agent.is_mobile # returns True 
    request.user_agent.is_tablet # returns False 
    request.user_agent.is_touch_capable # returns True 
    request.user_agent.is_pC# returns False 
    request.user_agent.is_bot # returns False 

    # Accessing user agent's browser attributes 
    request.user_agent.browser # returns Browser(family=u'Mobile Safari', version=(5, 1), version_string='5.1') 
    request.user_agent.browser.family # returns 'Mobile Safari' 
    request.user_agent.browser.version # returns (5, 1) 
    request.user_agent.browser.version_string # returns '5.1' 

    # Operating System properties 
    request.user_agent.os # returns OperatingSystem(family=u'iOS', version=(5, 1), version_string='5.1') 
    request.user_agent.os.family # returns 'iOS' 
    request.user_agent.os.version # returns (5, 1) 
    request.user_agent.os.version_string # returns '5.1' 

    # Device properties 
    request.user_agent.device # returns Device(family='iPhone') 
    request.user_agent.device.family # returns 'iPhone' 

在模板中的用法如下:

{% if request.user_agent.is_mobile %} 
    Do stuff here... 
{% endif %} 

但是,请注意中间件类在Django 1.10中已更改。因此,如果您使用的是Django 1.10 +,则必须修改此包中的中间件类定义,如GitHub issue tracker page中所述。

4

我找到了一个替代方法,从this answer开始。

通过添加额外的功能到views.py

import re 

def mobile(request): 
"""Return True if the request comes from a mobile device.""" 

    MOBILE_AGENT_RE=re.compile(r".*(iphone|mobile|androidtouch)",re.IGNORECASE) 

    if MOBILE_AGENT_RE.match(request.META['HTTP_USER_AGENT']): 
     return True 
    else: 
     return False 


def myfunction(request): 

    ... 
    if mobile(request): 
     is_mobile = True 
    else: 
     is_mobile = False 

    context = { 
     ... , 
     'is_mobile': is_mobile, 
    } 
    return render(request, 'mytemplate.html', context)