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?
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 .
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)