Creazione di 2 siti Django che la quota di 90% dati e codice
Domanda
Ho due siti strettamente correlati, un sito principale e un sito mobile, ospitato come un app Django. Avranno un sacco di le stesse funzionalità e necessità di accedere agli stessi dati. La differenza principale è i modelli saranno diverse e il modo in cui il sito è strutturato sarà diverso.
ho due host virtuali separati, uno per ogni (anche se non c'è bisogno di farlo in quel modo). Il mio primo pensiero è stato che il quadro siti Django aiuta a risolvere questo problema, ma la documentazione non sembrano descrivere il mio caso d'uso.
Qualcuno può darmi un suggerimento per sapere se sono sulla strada giusta? L'urls.py dovrà essere diversa poiché, ad esempio, la home page è completamente diverso tra le applicazioni. L'obiettivo principale è che per i dati nelle due applicazioni diverse da condividere e il codice per la gestione che non ha bisogno di essere duplicato.
Dal sito principale:
- utente invia un elemento che viene memorizzato nel modello
Dal sito mobile:
- utente visualizza un elenco di voci e vedere quello appena entrato sul sito principale
- l'utente dà un 5 stelle sulla voce recentemente aggiunto
Dal sito principale:
- utente visualizza un elenco di voci di prim'ordine e l'elemento aggiunto di recente (che ora ha un rating elevato) si presenta nella lista.
Soluzione 2
OK, entrambe le risposte sono grandi e hanno contribuito a quello che ho scelto per la mia soluzione finale.
Nel file settings.py c'è un'opzione chiamata ROOT_URLCONF. Ho creato due file settings.py, chiamato settings_desktop.py e settings_mobile.py e in ciascuno di essi usato il seguente codice:
from settings.py import *
ROOT_URLCONF = 'myapp.urls_mobile'
(o, nel caso del desktop, myapp.urls_desktop)
Questo dà realtà un sacco di caratteristiche fredde come la possibilità di utilizzare diverse directory dei modelli per ogni sito, anche se in realtà non ho intenzione di farlo.
Poi ho creato due versioni del file WSGI dove l'unica differenza era questa linea:
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings_mobile'
o
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings_desktop'
In ognuno degli host virtuali l'unica differenza è il WSGIScriptAlias ??linea che punti al diverso file di WSGI per ogni host.
Questo mi ha permesso di utilizzare efficacemente un Django app che poteva ospitare facilmente entrambi i siti.
Grazie per l'aiuto lavoro fuori una buona soluzione a questo.
Altri suggerimenti
Date un'occhiata a questa risposta a una domanda simile . In pratica si può semplicemente utilizzare gli stessi punti di vista e solo tornare modelli diversi in base alla user-agent. Inoltre, se si struttura la logica dell'applicazione in modo che sia suddiviso in diversi "apps" in Django termini, allora si può riutilizzare se avete bisogno di flussi diversi con componenti simili. Speriamo che questo si ottiene fuori e in esecuzione.
UPDATE:
Allora supponiamo di avere il vostro sito principale http://www.mainsite.com/ che ha il proprio models.py urls.py e views.py che rende la funzionalità per il sito principale. Poi devi http://www.m.mainsite.com/ che ha il proprio set di gli URL, e punti di vista. Poi si può semplicemente importare modelli del sito principale e utilizzarli nei siti viste mobili.
Ho fatto qualcosa di molto simile, una volta. Il mio modo di risolvere questo problema di urls.py multipla era qualcosa di simile a questo:
Crea due urlconf, uno per ogni sito;
Crea un nuovo 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
Controlla anche il motivo per cui si deve fare i patch_vary_headers sul docs .