Apache: Multi-Site Configuration

Django, Flask, Bottle, WSGI, CGI…
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Also bei mir steht auch unter Django und FastCGI auf Apache die Domain in HTTP_HOST...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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'

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Ist doch klar oder? Zum Zeitpunkt, zu dem die Settings geladen werden gibt es natürlich auch noch nicht viel vom Environment…
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mag sein. Aber wie bekomme ich halt die Information in die settings.py?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich hab es im VirtualHost Abschnitt gepackt. Woanders habe ich keinen Zugriff.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

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…
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Weil alle Variablen in der settings.py identisch sind, bis auf die SITE_ID.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dann erbe doch von der ``settings.py``...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Leonidas hat geschrieben:Dann erbe doch von der ``settings.py``...
Von einem Modul "erben"?!
Sorry, mir ist schon klar, wie das gemeint ist ;)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Warum musst du dann für jede Domain ein eigenes "htdocs" Verzeichnis anlegen? Es laufen halt dann mehrere "Instanzen" deiner App mit verschiedenen settings...
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

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…
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten