84 votes

Comment détecter le type de navigateur dans Django ?

Comment puis-je détecter le type de navigateur utilisé par le client ? J'ai un problème où je dois demander aux gens d'utiliser un autre navigateur (Firefox) au lieu d'IE. Comment puis-je obtenir cette information ?

Je sais que la requête http contient cette information (Header). Comment puis-je obtenir le nom de l'application du navigateur à partir du fichier view.py dans le cadre de Django ?

132voto

digitaldreamer Points 11102

Vous pouvez extraire cette information de l'objet de la demande comme suit :

request.META['HTTP_USER_AGENT']

43voto

Ahmad Awais Points 9142

Il existe de multiples façons d'y parvenir.

La méthode la plus simple est celle recommandée par @digitaldreamer. C'est-à-dire que vous pouvez faire une méta-demande de HTTP_USER_AGENT .

request.META['HTTP_USER_AGENT']

Mais je vous recommande également de jeter un coup d'oeil à la Agents utilisateurs de Django bibliothèque.

Installez-le avec pip

pip install pyyaml ua-parser user-agents
pip install django-user-agents

Et configurer settings.py :

MIDDLEWARE_CLASSES = (
    # other middlewares...
    'django_user_agents.middleware.UserAgentMiddleware',
)

INSTALLED_APPS = (
    # Other apps...
    'django_user_agents',
)

# Cache backend is optional, but recommended to speed up user agent parsing
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

# Name of cache backend to cache user agents. If it not specified default
# cache alias will be used. Set to `None` to disable caching.
USER_AGENTS_CACHE = 'default'

L'utilisation est également très simple.

A user_agent sera maintenant ajouté à la requête, que vous pourrez utiliser dans views.py :

def ma_vue(demande) :

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

11voto

Alex Sexton Points 7635

Vous pouvez consulter la "chaîne de l'agent utilisateur" et analyser les valeurs.

Voici les documents pertinents, notamment sur ( HTTP_USER_AGENT ):

http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.META

1voto

Cubiczx Points 685

Pour détecter si c'est internet explorer 8 ou plus ancien IE :

is_IE_8_or_lower = re.findall(r'MSIE [2-8]',request.request.META['HTTP_USER_AGENT'])

1voto

J0ANMM Points 2047

Desde cette question SO une solution purement html utilisant commentaires conditionnels :

<!--[if IE]> 
    <div>
       This site is not rendered properly with Internet Explorer. 
       Please use Firefox instead
    </div>
<![endif]-->

Comme indiqué dans la documentation :

À partir d'Internet Explorer 10, les commentaires conditionnels ne sont plus supportés par le mode standard. Utilisez la détection des fonctionnalités pour fournir stratégies de repli efficaces pour les fonctionnalités du site Web qui ne sont pas prises en charge par le navigateur. prises en charge par le navigateur

Je l'ai testé dans IE7, IE9, IE10 et IE11. La seule version où cela n'a pas fonctionné est IE10...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X