web-dev-qa-db-fra.com

Détectez les appareils mobiles avec Django et Python 3

J'ai du mal à trouver un moyen facile de détecter si la demande provient d'un appareil mobile dans mes vues Django.

J'essaye d'implémenter quelque chose comme ceci:

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

Et en mytemplate.html:

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

Partout où j'ai vérifié (par exemple ici ou ici ), minidétecteur est recommandé. J'ai installé différentes versions: pip install minidetector, pip install minidetector2, ainsi que directement quelques référentiels github, mais aucun d'entre eux n'est compatible avec Python 3.

Alors voici ma question: Existe-t-il une version/fork de minidétecteur compatible avec Python 3? Sinon, quelles sont les alternatives?

13
J0ANMM

Django User Agents le package est compatible avec Python 3.

Suivez les instructions d'installation dans le lien fourni ci-dessus, puis vous pouvez l'utiliser comme suit:

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'

L'utilisation dans le modèle est la suivante:

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

Cependant, notez que la classe middleware a changé dans Django 1.10. Donc, si vous utilisez Django 1.10 +, vous devrez modifier la définition de la classe middleware dans ce paquet comme indiqué dans ce page de suivi des problèmes GitHub .

18
bhaskarc

J'ai trouvé un moyen alternatif, à partir de cette réponse .

En ajoutant une fonction supplémentaire dans 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)
7
J0ANMM