[Django] SITE_ID dynamisch in middleware setzten?

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

In PyLucid nutzte ich ja intensiv das Site Framework um mehrere Seiten mit einer Installation zu beantworten, die alle auf die selben Datenbank Daten zugreifen.

Doch ich hab mir überlegt, das es doch schön wäre, wenn man nicht jeweils eine Instanz pro SITE_ID erstellen müßte, sondern per Middleware dynamisch die SITE_ID zu setzten.

Dann müßte man nur eine neue Domain in die SITE-Tabelle eintragen und gut. Die Middleware schaut welche aktuelle Domain genutzt wird und setzt die SITE_ID...

Was meint ihr?

Natürlich ist es nicht so toll, die SITE_ID in der settings dynamisch zu ändern. Vielleicht könnte man es ja so machen, das man im settings Objekt die statische SITE_ID durch eine Funktion ersetzt?

EDIT: Hab dazu ein paar Sachen gefunden:
https://bitbucket.org/uysrc/django-dyna ... s/overview
http://stackoverflow.com/questions/5583 ... -good-idea

https://code.djangoproject.com/ticket/4438
https://groups.google.com/group/django- ... 92c72ed59/
https://groups.google.com/group/django- ... de7944de3/

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hab mal angefangen: https://github.com/jedie/django-tools/b ... micSite.py

Ziel ist es, das ein Zugriff über Site.objects.get_current() oder über settings.SITE_ID überall funktioniert.

Erste Tests funktionieren. Aber über DynamicSiteId() bin ich noch nicht so recht glücklich.

Verbesserungsvorschläge ?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mir ist noch eingefallen, das man einen Fallback auf z.B. os.environ["SITE_ID"] machen könnte. Die variable könnte man in manage.py setzten, damit man auch außerhalb von Requests arbeiten kann.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

So, hab nun DynamicSiteMiddleware im praktischen Einsatz und sieht so aus, das es gut funktioniert ;)

Ist in der neuen django-tools v0.20.0 enthalten: http://pypi.python.org/pypi/django-tools/

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Habe nun die Sache noch ein wenig erweitert: Nun kann man "domain name aliases" angeben. Einmal als normaler String z.b.: "neuer_server.foobar.tld" oder als regex: ".*?\foobar\.tld"

Ist ganz nett, wenn man einen neuer Server hat kann man so vorgehen:

Dump vom alten einspielen.
sub-domains einrichten und auf neuen Server IP zeigen lassen
alias einrichten, damit die sub-domains nicht auf "fallback" SITE_ID zurück fallen, sondern der richtigen Seite zugewiesen werden...

Ich hab noch unittest hinzugefügt: https://github.com/jedie/django-tools/b ... e/tests.py

Damit Änderungen auch im Multi-Threaded Umfeld funktionieren, nutzte ich wieder https://github.com/jedie/django-tools/b ... c_cache.py

Mehr Info, zu Dynamic SITE_ID: https://github.com/jedie/django-tools/b ... DME.creole

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