django <-> WSGI

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Also WSGI ist ja eigentlich sowas wie ein Generator. Beim ersten Starten (zumindest bei fastCGI, mod_Python und Co.) wird dieser einmal Instanziert/Initialisiert. Jeder Request wird rein "geschickt" und die Ausgaben zum Client gesendet...

Bei Django ist es aber irgendwie komisch. Man verknüpft ja URLs per RE an einen View. Ein View ist allerdings nur eine normale Funktion.

Was mache ich also, wenn ich in django gern mit Klassen rumwerkeln möchte? Wenn z.B. einige Dinge nur einmalig erledigt (initialisiert) werden muß, packe ich das in __init__ rein. Bei django habe ich aber nicht die Möglichkeiten dazu... Ich müsste eigentlich bei jedem view Dinge initialisieren um sie benutzten zu können.

Hab ich da was übersehen???

EDIT: Mir fällt da doch eine Variante ein: middlewares...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Nimm Dekoratoren.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hm. OK, mit Dekoratoren kann ich quasi Routinen auslagern. Wobei ich das auch mit normalen Funktionen machen kann.

Das ist aber nicht das Problem, was ich meinte.

Also mit einer Middleware kann ich das machen:

Code: Alles auswählen

class BeispielMiddleware(object):
    cache = {}
    
    def __init__(self):
        # Mache aufwendige initialisierungen
        foo = Foo()
        
    def process_view(self, request, view_func, view_args, view_kwargs):
        # Nutzt für jeden request das initialisierte Objekt
        if bla in self.cache:
            response = self.cache[bla]
        else:
            response = foo.process_view(request)
            
        return response
In __init__ kann ich also alle Dinge machen, die nicht request Abhängig sind.
Außerdem könnte ich einen kleinen Cache aufziehen...

Das kann ich nicht mit normalen Funktionen und ich wüsste nicht wie Dekoratoren da helfen könnten.

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