2010-04-19 22 views
39

¿Cómo puedo detectar qué tipo de navegador está usando el cliente? Tengo un problema donde tengo que pedirle a la gente que use un navegador diferente (Firefox) en lugar de IE. ¿Cómo puedo obtener esta información?¿Cómo detectar el tipo de navegador en Django?

Sé que la solicitud http tiene esta información (Encabezado). ¿Cómo obtendré el navigator.appName de view.py en Django framework?

+3

que podría aceptar una respuesta de vez en cuando ..... – KevinDTimm

Respuesta

68

se puede extraer que la información de la solicitud objeto de esta manera:

request.META['HTTP_USER_AGENT'] 
+0

Pero con el script java puedo obtener la información del navegador simplemente haciendo document.write ("Nombre del navegador:" + navigator.appName); que da Microsoft Internet Explorer. No hay un método directo para obtenerlo? Quiero decir que tengo que analizar el agente de usuario y buscar MSIE. – AlgoMan

+3

En el pasado he escrito middleware personalizados para manejar la detección de navegador para cosas como el móvil. Si realizas esta ruta, realmente debes tener cuidado con el almacenamiento en caché o, de lo contrario, las cosas fallarán aleatoriamente de formas extrañas. Si solo necesita hacer excepciones para IE, es mejor usar los Comentarios condicionales de IE http://msdn.microsoft.com/en-us/library/ms537512(VS.85).aspx. – digitaldreamer

+0

Creo que los comentarios condicionales son más simples :). Gracias digitaldreamer – AlgoMan

8

Puede buscar en la 'cadena de agente de usuario' y analizar los valores.

Aquí está la documentación pertinentes, específicamente en (HTTP_USER_AGENT):

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

+5

cómo podemos analizarlo? Aquí está la cadena, y la información del navegador está por todos lados. ¿Tienes el punto? 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/33.0.1750.146 Safari/537.36' – Clayton

11

Hay varias maneras de conseguir que hecho.

La manera más fácil es lo que se recomienda @digitaldreamer. Es decir, puede hacer una meta solicitud para HTTP_USER_AGENT.

request.META['HTTP_USER_AGENT'] 

Pero también le recomendaría echar un vistazo a la biblioteca Django User Agents.

instalarlo con pip

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

y configurar 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' 

El uso es bastante simple también.

ahora se añade un atributo user_agent a solicitar, que se puede utilizar en views.py:

def my_view (petición):

# 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, una solución HTML puro usando conditional comments:

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

Como se advirtió en la documentación:

A partir de Internet Explorer 10, los comentarios condicionales ya no son compatibles con el modo estándar. Usar la detección de características para proporcionar estrategias de repliegue eficaces para características del sitio web que no son compatibles con el navegador

he comprobado en IE7, IE9, IE10 e IE11. La única versión que esto no funcionaba era IE10 ...

0

Para detectar si es Internet Explorer 8 o más IE:

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