2010-04-19 14 views
39

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 de IE. Comment puis-je obtenir cette information.Comment détecter le type de navigateur dans Django?

Je sais que la requête http a cette information (en-tête). Comment vais-je obtenir le nom navigateur.appName à partir de view.py dans le framework Django?

+3

vous pouvez accepter une réponse de temps en temps ..... – KevinDTimm

Répondre

68

Vous pouvez extraire ces informations de l'objet de la demande comme ceci:

request.META['HTTP_USER_AGENT'] 
+0

Mais avec le script java je peux obtenir les informations du navigateur en faisant juste document.write ("Browser Name:" + navigator.appName); ce qui donne Microsoft Internet Explorer. Il n'y a pas de méthode directe pour l'obtenir? Je veux dire que je dois analyser l'agent utilisateur et rechercher MSIE. – AlgoMan

+3

Dans le passé, j'ai écrit un middleware personnalisé pour gérer la détection de navigateur pour des choses comme les mobiles. Si vous allez à cette déroute, vous devez vraiment faire attention à votre mise en cache, sinon les choses échoueront de manière étrange de manière étrange. Si vous avez seulement besoin de faire des exceptions pour IE, il est préférable d'utiliser les commentaires conditionnels IE http://msdn.microsoft.com/en-us/library/ms537512(VS.85).aspx. – digitaldreamer

+0

Je pense que les commentaires conditionnels sont plus simples :). Merci digitaldreamer – AlgoMan

8

Vous pouvez regarder dans la 'chaîne d'agent utilisateur' et analyser les valeurs.

est ici les documents pertinents, en particulier sur (HTTP_USER_AGENT):

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

+5

comment Pouvons-nous l'analyser? Voici la chaîne, et l'info du navigateur est partout. Vous avez compris? 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, comme Gecko) Chrome/33.0.1750.146 Safari/537.36' – Clayton

11

Il y a plusieurs façons d'obtenir cette terminé.

Le plus simple est ce que @digitaldreamer a recommandé. C'est vous pouvez faire une demande de méta pour HTTP_USER_AGENT. Mais je vous recommande également de jeter un oeil à la bibliothèque Django User Agents.

installer avec pépin

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

et configurer settings.py:

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 assez simple aussi bien.

Un attribut user_agent sera maintenant ajouté à demander, que vous pouvez 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' 
0

De this SO question, une solution pure HTML en utilisant conditional comments:

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

Comme prévenu par la documentation:

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

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

0

Pour détecter si est Internet Explorer 8 ou plus IE:

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