[Django] Dynamisch die urls ändern...

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

Wie könnte man eine dynamische urls.py realisieren? Die sich zum einen teil statisch in der urls.py festgelegt wird, aber auch teilweise mit dynamischen Daten aus der Datenbank zusammensetzt?

Bin dabei PyLucid von Django 1.4 auf Django 1.5 zu "portieren"... Dabei funktioniert meine bisherige Lösung nicht, wie Plugins ihre eigenen urls.py haben können:

PyLucid plugins sollen möglichst so aufgebaut sein, wie normale Django apps. Also möglichst wenig zusätzlichen Kram.
Deswegen hat jedes Plugin auch eine eigene, normale urls.py, wie z.B.: pylucid_plugins/blog/urls.py

Diese urlpatterns wird dynamisch eingefügt, anhand dessen wo der User sein Blog/plugin in den Seiten-Baum eingefügt hat.

Ideen?

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 ein wenig gesucht:

Die Lösung von https://github.com/matllubos/django-dynamicpages ist es quasi alles selbst zu machen. Was eigenes um die url-pattern auszubauen und was eigenes um in Templates eine URL zu setzten.

Bei feincms braucht man auch was spezielles. Im Template sieht es dann z.B. so aus:

Code: Alles auswählen

{% load feincms_tags applicationcontent_tags %}
...
<a href="{% app_reverse "blog_entry_list" request %}">...
In PyLucid kann man halt in den Plugins alles so machen, als wären es normale Django apps. Also sieht das so aus:

Code: Alles auswählen

<a href="{% url "blog_entry" entry.id %}">...
Halt über den normalen weg.

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 ein weg gefunden. Nicht schön, aber wie soll es auch anders sein ;)

Ich füge in der urls.py erstmal statisch einen Platzhalter ein, hier: https://github.com/jedie/PyLucid/commit ... 5bf#L26L91
Dient eigentlich nur dazu die position der Plugin urls.py festzulegen.

Der Platzhalter wird dann, nach der Initialisierung, durch die eigentlichen urls aus der Datenbank ersetzt. Hier: https://github.com/jedie/PyLucid/commit ... 5bf#L21R83

Funktioniert anscheinend. Noch fehlt allerdings das Aktualisieren, wenn man halt den Seitenbaum ändert. Bsp. bestehende Plugin-Seite verschieben/umbenennen oder eine neue PluginSeite erstellen.

EDIT:
Hab mal ein Aktualisieren angefangen, hier: https://github.com/jedie/PyLucid/commit ... 4efff1b84a

Dabei kommen wir zum Problem der Sache: Das aktualisieren funktioniert nur für den aktuellen Thread, in einer Multi-Thread-Umgebung :?

Muß also eine Lösung ähnlich dem https://github.com/jedie/django-tools/b ... c_cache.py her: Also Synchronisieren über die Datenbank...

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 nochmal Umgebaut und eine andere IMHO bessere Lösung implementiert: https://github.com/jedie/PyLucid/commit ... de04a64f25

Nun wird django-tools 'local sync cache' genutzt.

d.h. in multi-threaded environments sollte es keine Probleme geben. Man kann munter Plugin Seiten verschieben/anlegen/ändern/löschen und in allen threads sind die Änderungen synchron.

Bei einer änderung des Seitenbaums werden die Plugin URLs einfach neu "aufgebaut" und die verschiedenen URL caches geleert. Und über 'local sync cache' in allen Threads.

Das ganze erweitert dann generell PyLucid, weil es nun möglich ist überall URLs von Plugin per resolve zu erzeugen.

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:

Vielleicht sollte ich das ganze mal aus PyLucid herraus scheiden, verallgemeinern, sodas eine "reuseable app" draus wird...

Da bin ich mit der django 1.5 Umstellung noch nicht fertig ist schon 1.6 raus... :?

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