Frage

Ich habe eine Django-Website gemacht, aber ich habe das Koolaid trank, und ich möchte ein IPhone Version machen. Nachdem er viel Gedanken in ich mit zwei Optionen habe kommen:

  1. Erstellen Sie eine ganz andere Seite, wie i.xxxx.com. Binden Sie es in die gleiche Datenbank mit Django Websites Rahmen.
  2. einige Zeit von Middleware finden, die den User-Agent liest und ändert die Vorlage Verzeichnisse dynamisch.

Ich würde wirklich lieber Option # 2, jedoch; Ich habe einige Vorbehalte, vor allem, weil die Django-Dokumentation Ändern von Einstellungen im laufenden Betrieb schreckt . Ich fand ein Schnipsel , die das tun würde, was Ich mag würde. Mein Hauptproblem ist es so nahtlos wie möglich mit, ich mag es Automagic und für den Benutzer transparent sein.

Hat jemand anderes über die gleiche Frage kommen? Würde jemand kümmert sich um zu teilen, wie sie IPhone machen Versionen von Django Websites in Angriff genommen haben?

Aktualisieren

Ich war mit einer Kombination von Middleware und zwicken die Vorlage Anruf.

Für die Middleware, habe ich minidetector . Ich mag es, weil es ein erkennt Fülle mobilen User-Agents. Alles, was ich tun muß, ist request.mobile in meinen Ansichten überprüfen.

Für die Vorlage Aufruf zwicken:

 def check_mobile(request, template_name):
     if request.mobile:
         return 'mobile-%s'%template_name
     return template_name

Ich benutze dies für jede Ansicht, dass ich weiß, ich habe beiden Versionen.

TODO:

  • Finde heraus, wie der Zugriff auf request.mobile in einer erweiterten Version von render_to_response so habe ich nicht check_mobile verwenden ( 'template_name.html')
  • Mit dem vor der regulären Vorlage automatisch Rückfall, wenn keine mobile Version vorhanden ist.
War es hilfreich?

Lösung

Anstatt die Vorlage Verzeichnisse dynamisch ändern können Sie die Anfrage ändern und einen Wert hinzufügen, die Ihre Ansicht nach wissen lassen, wenn der Benutzer auf einem iPhone ist oder nicht. Dann wickelt render_to_response (oder was auch immer Sie verwenden für das Erstellen Httpresponse Objekte) anstelle der Standard-HTML-Version der iPhone-Version der Vorlage zu greifen, wenn sie ein iPhone verwenden.

Andere Tipps

Detect den User-Agent in Middleware, schalten Sie die URL-Bindungen, Gewinn!

Wie? Django Anfrage Objekte haben eine .urlconf Attribut, das von Middleware eingestellt werden kann.

Von django docs:

  

Django bestimmt die Wurzel URLconf   Modul zu verwenden. Normalerweise ist dies die   Wert der ROOT_URLCONF Einstellung, aber   wenn das ankommende Httprequest-Objekt hat   ein Attribut namens URLconf (eingestellt durch   Middleware-Anforderungsverarbeitung), ihre   Wert wird anstelle der verwendet werden   ROOT_URLCONF Einstellung.

  1. In yourproj / middlware.py, schreiben Sie eine Klasse, die die HTTP_USER_AGENT Zeichenfolge überprüft:

    import re
    MOBILE_AGENT_RE=re.compile(r".*(iphone|mobile|androidtouch)",re.IGNORECASE)
    class MobileMiddleware(object):
        def process_request(self,request):
            if MOBILE_AGENT_RE.match(request.META['HTTP_USER_AGENT']):
                request.urlconf="yourproj.mobile_urls"
    
  2. Vergessen Sie nicht, dies zu MIDDLEWARE_CLASSES in settings.py hinzuzufügen:

    MIDDLEWARE_CLASSES= [...
        'yourproj.middleware.MobileMiddleware',
    ...]
    
  3. Erstellen Sie eine mobile URLconf, yourproj / mobile_urls.py:

    urlpatterns=patterns('',('r'/?$', 'mobile.index'), ...)
    

Ich entwickle djangobile, eine django mobile Erweiterung: http://code.google.com / p / djangobile /

Sie sollten einen Blick auf dem django-mobilen Quellcode, der gelöst genau dieses Problem.

Andere Art und Weise würde Ihre eigene Vorlage loader werden erstellen, die Vorlagen speziell für User-Agent lädt. Das ist ziemlich generische Technik und kann verwendet werden, um dynamisch zu bestimmen, welche Vorlage geladen werden muss in Abhängigkeit von anderen Faktoren auch, wie gewünschte Sprache (guter Begleiter zu bestehenden Django i18n Maschinen).

Django Buch hat eine Abschnitt zu diesem Thema rel="nofollow.

Es gibt einen schönen Artikel, der erklärt, wie die gleichen Daten, die von verschiedenen Vorlagen machen http://www.postneo.com/ 2006/07/26 / Quittieren-the-mobile-web-mit-django

Sie müssen noch die Benutzer automatisch auf mobile Site umleiten jedoch, und dies kann mit verschiedenen Methoden erfolgen (Ihr check_mobile Trick funktioniert auch)

Wie wäre es Umleitung Benutzer i.xxx.com nach seinem UA in einigen Middleware Parsen? Ich sehr bezweifle, dass mobile Nutzer egal, wie url aussehen, noch können sie auf Ihre Website zugreifen Haupt-URL.

bestmögliche Szenario: Verwendung minidetector die zusätzliche Informationen zu der Anfrage hinzuzufügen, dann Djangos in Anforderungskontext gebaut verwenden Sie es wie so Ihre Vorlagen passieren

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

dann in der Vorlage sind Sie in der Lage Sachen vorstellen wie:

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

Eine einfache Lösung ist ein Wrapper um django.shortcuts.render zu erstellen. Ich habe Mine in einer utils Bibliothek in der Wurzel meiner Anwendung. Der Wrapper funktioniert, indem es automatisch Rendering-Vorlagen entweder in einem "mobilen" oder "Desktop" -Ordner.

In utils.shortcuts:

from django.shortcuts import render
from user_agents import parse

def my_render(request, *args, **kwargs):
  """
  An extension of django.shortcuts.render.

  Appends 'mobile/' or 'desktop/' to a given template location
  to render the appropriate template for mobile or desktop

  depends on user_agents python library
  https://github.com/selwin/python-user-agents

  """
  template_location = args[0]
  args_list = list(args)

  ua_string = request.META['HTTP_USER_AGENT']
  user_agent = parse(ua_string)

  if user_agent.is_mobile:
      args_list[0] = 'mobile/' + template_location
      args = tuple(args_list)
      return render(request, *args, **kwargs)
  else:
      args_list[0] = 'desktop/' + template_location
      args = tuple(args_list)
      return render(request, *args, **kwargs)

In view:

from utils.shortcuts import my_render

def home(request):    return my_render(request, 'home.html')
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top