grundsätzliche Frage zu Werkzeug

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Hallo,

momentan nutze ich eine einzige "views.py", in der ich alle view-functions definiere. Nun, das wird bei größeren Applikationen ziemlich unübersichtlich und groß. Deswegen habe ich mir überlegt, ob es nicht sinnvoller wäre, wie in Django mehrere Apps anzulegen mit evtl. eigenen models und eben eigenen view-functions. Damit das ganze etwas übersichtlicher, besser administrier- und erweiterbar wird.
Irgendwie könnte ich mir das natürlich zusammenbauen - nur wäre mir eine professionelle Umsetzung sehr viel lieber. Ich konnte irgendwie nichts dazu finden und wäre sehr dankbar für ein Beispiel oder auch Anregungen. Vllt. könnte man das auch in die Doku von Werkzeug mit aufnehmen.

Vielen Dank!
MfG
Kamaze
User
Beiträge: 4
Registriert: Samstag 24. März 2007, 19:40

Kategorisiere doch deine URL-Rules und Views und teile die demnach auf. Beispiel:

views/admin.py
views/content.py
...

Oder noch feiner:

views/admin/content.py
views/admin/users.py
views/admin/settings.py
views/content/articles.py
views/content/downloads.py
...

Oder sogar so, das Du für jede View-Funktion nen eigene .py hast :)

Lässt sich mit den Endpoints doch prima regeln, so wie man es gerne haben möchte.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Danke, aber meine Frage bezog sich eher darauf, wie ich das mit dem url-adapter umsetze

Code: Alles auswählen

try:
    endpoint, values = adapter.match()
    handler = getattr(views, endpoint)
    response = handler(request, **values)
except NotFound, e:
    response = views.not_found(request)
    response.status_code = 404
except HTTPException, e:
    response = e
return ClosingIterator(response(environ, start_response),
                       [local_manager.cleanup])
Momentan "dispatche" ich die requests auf diese Weise und habe eben meine view-functions alle in einer Datei -> views(.py)
Meine Frage war nun, wie man das "sauber" macht in dem gewünschten Fall.
lunar

Beispielsweise so:

Code: Alles auswählen

endpoint, values = adapter.match()
qualified_name = "myapp.views.{0}".format(endpoint)
func = import_string(qualified_name)
response = func(request, **values)
import_string ist eine Hilfsfunktion in Werkzeug (ich hätte sie auch gerne direkt verlinkt, aber die Werkzeug-Doku hat leider keine Anker an dieser Stelle). Allerdings solltest du das noch mit Caching versehen, indem du ein Wörterbuch, dass Endpoints auf bereits importierte View-Funktionen abbildet. Das ersetzt den relativ teueren Import durch ein einfaches Nachschlagen im Wörterbuch.

Im Übrigen würde ich das Dispatching aus dem Eintrittspunkt der Anwendung auslagern.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Wenn deine Endpoints das Format `app/view` hätten, könntest du doch einfach dies machen:

Code: Alles auswählen

app, view = endpoint.split("/")
handler = getattr(apps[app], view)
Die Variable `apps` muss jetzt natürlich passend mit einem dict von Name auf Modul initialisiert sein. Dies könntest du am Programmanfang machen:

Code: Alles auswählen

apps = {}
register('blog')
register('wiki')

def register(name): apps[name] = getattr(__import__("views." + name), name)
Nun kannst du in `views/blog.py` eine View-Funktion `index` definieren, die dann den Endpunkt `blog/index` bildet.

Der Vorteil (und Nachteil) von Werkzeug ist doch, dass du alle Freiheiten hast, dir das selbst zu überlegen. Du unterliegt keinen Einschränkungen, die dich behindern oder aber auch leiten könnten.

Stefan
Zuletzt geändert von sma am Dienstag 24. März 2009, 12:22, insgesamt 1-mal geändert.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

super, das ist das was ich gesucht habe! Danke euch zwei!
Antworten