2010-02-23 5 views
32

J'ai une application web écrite en Django qui a une page spécifique que je voudrais mettre en œuvre une version mobile du modèle (et une logique légèrement différente) pour. Je voudrais être en mesure de mettre en œuvre ala ce code sudo:Détecter navigateur mobile (pas seulement iPhone) en vue python

def(myView) 

    do some stuff 

    if user-is-on-a-mobile-device: 
    do some stuff 
    return (my mobile template) 

    else: 
    do some stuff 
    return (my normal template) 

Je n'ai pas une énorme quantité de temps et je suis assez tôt dans ma courbe d'apprentissage de codage :) - J'ai trouvé ce que semble être une application pluggable très puissante appelée bloom pour obtenir des capacités de périphérique mobile - http://code.google.com/p/django-bloom/wiki/BloomDevice Cependant, il semble faire une demande via JSON pour obtenir beaucoup de spécifications de l'appareil dont je n'ai pas besoin, ce qui me semble un peu inefficace.

Quelqu'un a-t-il une méthode plus simple? Ma détection n'a pas besoin d'être 100%, juste iPhone, iPod, android, et les appareils grand public ...

Est-ce que la chaîne http_user_agent possède un type de drapeau mobile que je peux vérifier?

+0

faute de frappe: = pseudo – pmont

Répondre

19

Mise à jour:

Je viens de découvrir: http://code.google.com/p/minidetector/

Ce qui semble faire exactement ce que je veux, je vais maintenant tester. N'hésitez pas à me dire que je me trompe!

+0

sudo Merci pour le partage qui trouvent. Pour moi, ce que ce middleware semble être une meilleure solution que tous ceux que j'ai jamais utilisés pour atteindre des objectifs similaires. – ayaz

+2

Est-ce que ce projet est à jour? Il n'a pas vu de changement depuis décembre 2010. J'utilisais plutôt https://github.com/shelfworthy/minidetector car il était activement développé. Malheureusement, l'auteur vient de me dire qu'il n'est plus supporté et il voulait supprimer ce dépôt de github, donc je cherche un remplaçant. –

+0

Si vous vérifiez le réseau pour minidector il ya quelques fourchettes qui ne sont pas si obsolètes - https://github.com/saschwarz/minidetector/network – Alvin

15

meilleure pratique: utilisez minidetector pour ajouter les informations supplémentaires à la demande, puis utilisez le contexte de requête intégré de django pour le transmettre à vos modèles comme ça.

from django.shortcuts import render_to_response 
from django.template import RequestContext 

def my_view_on_mobile_and_desktop(request) 
    ..... 
    render_to_response('regular_template.html', 
         {'my vars to template':vars}, 
         context_instance=RequestContext(request)) 

alors dans votre modèle, vous êtes en mesure de présenter des choses comme:

<html> 
    <head> 
    {% block head %} 
    <title>blah</title> 
    {% if request.mobile %} 
    <link rel="stylesheet" href="{{ MEDIA_URL }}/styles/base-mobile.css"> 
    {% else %} 
    <link rel="stylesheet" href="{{ MEDIA_URL }}/styles/base-desktop.css"> 
    {% endif %} 
    </head> 
    <body> 
    <div id="navigation"> 
     {% include "_navigation.html" %} 
    </div> 
    {% if not request.mobile %} 
    <div id="sidebar"> 
     <p> sidebar content not fit for mobile </p> 
    </div> 
    {% endif %> 
    <div id="content"> 
     <article> 
     {% if not request.mobile %} 
     <aside> 
      <p> aside content </p> 
     </aside> 
     {% endif %} 
     <p> article content </p> 
     </aricle> 
    </div> 
    </body> 
</html> 
+1

Beaucoup de gens suivent cette convention, même si je ne l'aime pas parce que cela force les développeurs à avoir une multitude d'instructions if au lieu d'une seule. Vous pouvez argumenter que montrer des modèles différents n'est pas DRY, mais je pense que le fait de séparer les deux en vaut la peine. – Mikhail

7

aller pour la fourche de minidetecor appelé django-mobi, il comprend la documentation sur la façon de l'utiliser.

https://pypi.python.org/pypi/django-mobi

+0

Cela semble être la meilleure solution. __ "Fourche Description: J'ai réorganisé le code, ajouté la mise en cache, et fait quelques ajustements ici et là." – Druska

Questions connexes