2017-02-16 83 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)