Seite 1 von 2
Apache: Multi-Site Configuration
Verfasst: Dienstag 24. November 2009, 08:21
von jens
Meine Web-App kann ist multi site fähig. d.h. mit einer installation und datenbank kann man gleichzeitig verschiedene Domains/Seiten anbieten.
Das Problem: Wie weiß meine Web-App welche Domain gerade den Request ausführt?
Ich brauche also die aktuelle "Domain". Doch in der settings.py von django steckt diese Information nicht im os.environ (z.B. bei fastCGI)
Ich dachte eigentlich mit
SetEnv könnte ich in der vhost eine Umgebungsvariable setzten. Aber die kommt nicht in die .fcgi Datei oder in der settings.py an.
z.Z. mache ich es so, das jeder domain auf ein eigenes Verzeichnis zeigt und darin steckt eine local_settings.py die für diese Domain angepasst ist.
Hätte ich aber die Information könnte ich sowas machen:
Code: Alles auswählen
domain = os.environ.get("DOMAIN")
if domain == "jensdiemer.de:
SITE_ID = 2
elif domain == "pylucid.org":
SITE_ID = 3
else:
SITE_ID = 1
Jemand Ideen dazu?
Verfasst: Dienstag 24. November 2009, 12:47
von Leonidas
Also bei mir steht auch unter Django und FastCGI auf Apache die Domain in HTTP_HOST...
Verfasst: Dienstag 24. November 2009, 13:25
von jens
Also ich hab in der index.fcgi und in der settings.py mal folgendes probiert:
Code: Alles auswählen
import os
f = file("os.environ.txt", "w")
f.write(repr(os.environ))
f.close()
Laut der Text Datei ist so gut wie nix im Environment.
In der Django App ist in request.META aber jede Menge, u.a. auch 'HTTP_HOST' und 'SERVER_NAME'
Verfasst: Dienstag 24. November 2009, 14:40
von apollo13
Ist doch klar oder? Zum Zeitpunkt, zu dem die Settings geladen werden gibt es natürlich auch noch nicht viel vom Environment…
Verfasst: Dienstag 24. November 2009, 14:52
von jens
Mag sein. Aber wie bekomme ich halt die Information in die settings.py?
Verfasst: Dienstag 24. November 2009, 17:36
von ms4py
IMHO müsste das mit SetEnv funktionieren. Wie hast du das den in der ``httpd.conf`` eingetragen?
Du könntest auch mal eine ``.htaccess`` im Verzeichnis des Skripts erstellen und dort "SetEnv" versuchen.
Verfasst: Dienstag 24. November 2009, 17:40
von jens
Ich hab es im VirtualHost Abschnitt gepackt. Woanders habe ich keinen Zugriff.
Verfasst: Dienstag 24. November 2009, 17:41
von Leonidas
Ich würd halt am Dispatcher gucken was da für eine Domain ist, statt dass ich auf irgendwelche Sachen zurückgreifen muss die der User explizit in der Webserver-Konfiguration eintragen muss (und die natürlich beim Development-Webserver nicht dabei sind), speziell wenn diese Variable ja eh vom Browser des Users übermittelt wird.
Verfasst: Dienstag 24. November 2009, 17:50
von jens
Leonidas hat geschrieben:Ich würd halt am Dispatcher gucken
Aber das ist doch die index.fcgi, oder nicht? Und da ist nix. (Ist auch auf PyHosting, da bist du doch auch Leonidas?)
Verfasst: Dienstag 24. November 2009, 18:45
von apollo13
jens hat geschrieben:Mag sein. Aber wie bekomme ich halt die Information in die settings.py?
gar nicht, wie auch? das environment wird doch erst beim request bestückt, wobei jetzt natürlich die frage ist wann genau django die settings lädt…
Verfasst: Dienstag 24. November 2009, 18:54
von Leonidas
jens hat geschrieben:Leonidas hat geschrieben:Ich würd halt am Dispatcher gucken
Aber das ist doch die index.fcgi, oder nicht? Und da ist nix. (Ist auch auf PyHosting, da bist du doch auch Leonidas?)
Nein, mit Dispatcher meine den Teil von Django der den Request entgegennimmt und dann den entsprechenden View aufruft.
Wobei... könntest du etwas ausholen? Was willst du eigentlich machen? Wozu willst du Sachen die erst beim Request bekannt sind, in den Settings haben?
Verfasst: Dienstag 24. November 2009, 19:47
von jens
Das hab ich ganz oben erwähnt. Also ich möchte quasi mit mehreren vhosts auf die selbe settings.py zeigen und darin die SITE_ID anhand der aktuellen vhost/Domain festlegen.
Eine alternative wäre evtl. eine middleware, die die SITE_ID on the fly ändert. Aber ist das Threadsafe?
Verfasst: Dienstag 24. November 2009, 19:53
von nemomuk
Warum der Aufwand? Normal erstelle ich für jede Domain/Site eine andere settings-Datei und verweise in meiner Starter-Datei auf die verschiedenen settings... verstehe den Sinn davon nicht.
Verfasst: Dienstag 24. November 2009, 20:00
von jens
Weil alle Variablen in der settings.py identisch sind, bis auf die SITE_ID.
Verfasst: Dienstag 24. November 2009, 20:03
von Leonidas
Dann erbe doch von der ``settings.py``...
Verfasst: Dienstag 24. November 2009, 22:22
von ms4py
Leonidas hat geschrieben:Dann erbe doch von der ``settings.py``...
Von einem Modul "erben"?!
Sorry, mir ist schon klar, wie das gemeint ist

Verfasst: Mittwoch 25. November 2009, 12:14
von jens
Leonidas hat geschrieben:Dann erbe doch von der ``settings.py``...
Ja, das ist schon mal eine Idee. Aber ehr unschön. Ich hätte dann einmal die default settings.py, dann eine "globale" local_settings.py und dann die jeweilige loca_settings.py zur domain, die dann die "globale" importiert.
Außerdem: Wenn ich die domain Information in der settings.py hätte, dann könnten alle Domains auf das selbe Verzeichnis zeigen lassen. So muß ich für jede Domain eine eigenes "htdocs" Verzeichnis anlegen.
Ist auf PyHosting eigentlich mod_WSGI verfügbar? Kann man das damit anders regeln?
Verfasst: Mittwoch 25. November 2009, 16:21
von nemomuk
Warum musst du dann für jede Domain ein eigenes "htdocs" Verzeichnis anlegen? Es laufen halt dann mehrere "Instanzen" deiner App mit verschiedenen settings...
Verfasst: Mittwoch 25. November 2009, 16:26
von apollo13
jens hat geschrieben:
Ist auf PyHosting eigentlich mod_WSGI verfügbar? Kann man das damit anders regeln?
Türlich kann man, es gibt SetEnv damit kannst du dem index.fcgi zusätzliche Environment Variablen mitgeben…
Verfasst: Freitag 12. März 2010, 18:06
von jens
apollo13 hat geschrieben:Türlich kann man, es gibt SetEnv damit kannst du dem index.fcgi zusätzliche Environment Variablen mitgeben…
Ja, das kenne ich. Ich hab damit rumexperimentiert. Allerdings hat es nicht so richtig geklappt

Die gesetzte Environment Variable kommt einfach nicht "an"...