2011-01-06 2 views
4

Ich habe zwei eng verwandte Seiten, eine Haupt-Website und eine mobile Website, gehostet als Django-App. Sie verfügen über die gleiche Funktionalität und müssen auf dieselben Daten zugreifen. Der Hauptunterschied besteht darin, dass die Vorlagen unterschiedlich sein werden und die Struktur der Website unterschiedlich sein wird.Erstellen von 2 Django-Seiten, die 90% Daten und Code teilen

Ich habe zwei separate virtuelle Hosts, einen für jeden (obwohl ich es nicht so machen muss). Mein erster Gedanke war, dass das Django-Sites-Framework dabei hilft, dies zu lösen, aber die Dokumente scheinen meinen Anwendungsfall nicht zu beschreiben.

Kann mir jemand einen Hinweis geben, ob ich auf dem richtigen Weg bin? Die urls.py muss anders sein, da zum Beispiel die Homepage zwischen den Apps völlig anders ist. Das Hauptziel ist, dass die Daten in den zwei verschiedenen Apps geteilt werden und der zu verwaltende Code nicht dupliziert werden muss.

Vom Hauptstandort:

  • Benutzer sendet ein Element, das

Von der mobilen Website im Modell gespeichert ist:

  • Benutzer eine Liste von Elementen betrachtet und sehen die ein gerade auf der Hauptseite eingegeben
  • Benutzer gibt eine 5-Sterne-Bewertung auf dem kürzlich hinzugefügt Artikel

Vom Hauptstandort:

  • User eine Liste von hoch bewerteten Produkten und die kürzlich hinzugefügte Position (die jetzt eine hohe Bewertung hat) zeigt auf der Liste nach oben.

Antwort

1

OK, beide Antworten sind großartig und haben zu dem beigetragen, was ich für meine endgültige Lösung gewählt habe.

In der Datei settings.py gibt es eine Option namens ROOT_URLCONF. Ich habe zwei Einstellungen erstellt.py Dateien, genannt settings_desktop.py und settings_mobile.py und in jedem dieser verwendet, um den folgenden Code ein:

from settings.py import * 

ROOT_URLCONF = 'myapp.urls_mobile' 

(oder im Fall von dem Desktop, myapp.urls_desktop)

Dies gibt tatsächlich eine Menge von coolen Funktionen wie die Möglichkeit, verschiedene Template-Verzeichnisse für jede Seite zu verwenden, obwohl ich das wirklich nicht machen werde.

Dann habe ich zwei Versionen der wsgi Datei, wo der einzige Unterschied dieser Linie war:

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings_mobile' 

oder

der einzige Unterschied ist die Linie der WSGIScriptAlias ​​In jeder der virtuellen Hosts, die verweist auf die verschiedenen wsgi-Dateien für jeden Host.

Dies erlaubte mir, effektiv eine Django-App zu verwenden, die beide Seiten problemlos aufnehmen konnte.

Vielen Dank für Ihre Hilfe eine gute Lösung zu erarbeiten.

4

Werfen Sie einen Blick auf this answer to a similar question. Grundsätzlich können Sie einfach die gleichen Ansichten verwenden und einfach verschiedene Vorlagen basierend auf dem User-Agent zurückgeben. Wenn Sie Ihre Anwendungslogik so strukturieren, dass sie in django-Begriffen in verschiedene "Apps" unterteilt ist, können Sie sie wiederverwenden, wenn Sie verschiedene Flüsse mit ähnlichen Komponenten benötigen. Hoffentlich bringt dich das zum Laufen.

UPDATE:

können also sagen, dass Sie Ihre Haupt-Website http://www.mainsite.com/ haben, die seine eigene urls.py models.py und views.py hat, die Ihre Funktionalität für den Hauptstandort macht. Dann haben Sie http://www.m.mainsite.com/, die ihren eigenen Satz von URLs und Ansichten hat. Dann können Sie einfach die Modelle der Hauptwebsite importieren und sie in den Ansichten für mobile Websites verwenden.

+0

Dank für den Kommentar, lässt dies jedoch einen wichtigen Teil der Frage unbeantwortet. Ich brauche wirklich verschiedene URLs.py, um Benutzer zu verschiedenen Ansichten zu senden, nicht nur verschiedene Renderings derselben Seite. – newz2000

+0

Nun, der zweite Teil meiner Antwort war, was ich damit anfangen wollte. Ich werde meine Antwort mit dem, was Sie zu fragen scheinen, aktualisieren und Sie können sehen, ob es das ist, wonach Sie suchen. –

+0

Ich lese gerade Ihre Frage erneut und denke, dass Sie nur die Modelle in Ihren Apps teilen möchten. –

0

Ich habe einmal etwas sehr ähnliches getan. Mein Weg zur Lösung dieses Problems von mehreren URLs.py war etwa so:

Erstellen Sie zwei URLconf, eine für jede Website;

Erstellen Sie eine neue Middleware:

from django.utils.cache import patch_vary_headers 

class DomainMiddleware: 

    def __init__(self): 
     pass 

    def process_request(self, request): 

     #avoid problems when reaching the server directly trough IP 
     host = request.META.get('HTTP_HOST', None) 
     if host is None: return 

     host = host.split(':')[0] #remove port number 

     if host is mobile: 
      urlconf = "mobile.urls" 
     else: 
      urlconf = "default.urls" 

     request.urlconf = urlconf 

    def process_response(self, request, response): 
     patch_vary_headers(response, ('Host',)) 
     return response 

prüfen auch, warum Sie die patch_vary_headers on the docs zu tun haben.

Verwandte Themen