2017-02-16 1 views
2

Ich habe Schwierigkeiten, einen einfachen Weg zu finden, ob die Anfrage von einem Mobilgerät in meinen Django-Ansichten kommt.Erkennen von Mobilgeräten mit Django und Python 3

Ich versuche, so etwas zu implementieren:

#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) 

Und in mytemplate.html:

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

überall geprüft I (zum Beispiel here oder here) wird minidetector empfohlen. Ich habe verschiedene Versionen installiert: pip install minidetector, pip install minidetector2, als auch direkt ein paar GitHub Repositories, aber keiner von ihnen sind kompatibel mit Python 3.

Also hier meine Frage: Gibt es eine Version/Gabel von minidetector, die kompatibel ist mit Python 3? Wenn nicht, was sind die Alternativen?

+0

Sie haben eine irrelevent Attribute Frage verknüpft. Poste deinen Stacktrace – e4c5

+0

Der Link sollte zeigen, dass der Minidetektor nicht mit Python 3 kompatibel ist. Ich habe ihn entfernt und diesen Teil neu formuliert, um jede Verwirrung über die Frage selbst zu vermeiden. – J0ANMM

Antwort

5

Django User Agents Paket ist kompatibel mit Python 3.

Folgen Sie den Installationsanweisungen in den darin enthaltenen Link oben und dann können Sie es wie folgt:

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' 

Die Verwendung in Vorlage wird wie folgt dar:

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

Beachten Sie jedoch, dass die Middleware-Klasse in Django 1.10 geändert hat. Wenn Sie also Django 1.10 + verwenden, müssen Sie die Middleware-Klassendefinition in diesem Paket wie in dieser GitHub issue tracker page angegeben ändern.

4

Ich fand einen alternativen Weg, beginnend mit this answer.

Durch das Hinzufügen einer zusätzlichen Funktion in 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) 
Verwandte Themen