[Django] Page cache + CSRF/Cookies...

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

Eine Django settings kann z.B. so aussehen:

Code: Alles auswählen

MIDDLEWARE_CLASSES = (
    'django.middleware.cache.UpdateCacheMiddleware',
...
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
...
    'django.middleware.cache.FetchFromCacheMiddleware',
)
CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True
Das dumme dabei: Der cache wird relativ ineffizient, weil quasi pro User gecached wird :(

Denn die SessionMiddleware und die CsrfViewMiddleware machen patch_vary_headers(response, ('Cookie',))
Das bewirkt ja, das der Cookie in den cache key eingebunden wird. Somit wird pro User einzeln gecached. Das ist aber eigentlich nicht wirklich notwendig.

Was also tun?

Eine Lösung wäre doch, nicht den Cookie beim cache key einbinden und beim Cachen der Seite den Cookie herausnehmen. Wird ein Response aus dem Cache genutzt, dann den Cookie wieder einfügen...

In meinem Falle wäre eine Möglichkeit, nicht UpdateCacheMiddleware und FetchFromCacheMiddleware zu nutzten und tiefer im System die Seite cachen und den Cache nutzten.

Wie macht ihr das?

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:

Ich spiele in einem test brach gerade mit der folgenden Idee:

Im Grunde wird auch die gesamte Seite (sprich das komplette response Objekt) gecached, aber die cookies werden vorher gelöscht. So braucht man nicht die cookies im Cache auf zu nehmen...

Das passiert im Grunde damit:

Code: Alles auswählen

    def process_response(self, request, response):
        ...
        cache_key = request.path

        cookies = response.cookies.copy() # Store the cookies from current user
        response.cookies.clear() # Don't cache any cookies
        cache.set(cache_key, response)
        response.cookies = cookies # Restore the cookies from the current user
        return response

Ich weiß aber nicht genau, ob das alles Nebenwirkungsfrei ist. Wenn es so einfach lösbar ist, warum wird es dann nicht in Django gemacht?

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:

Jemand ist auf das selbe Problem gestoßen: https://groups.google.com/d/msg/django- ... iNJsARF4IJ
Mal sehen was daraus wird ;)

Meine Lösung mit einer eigenen middleware ist in 'master' angekommen: https://github.com/jedie/PyLucid/blob/m ... s/cache.py

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

jens hat geschrieben:Ich weiß aber nicht genau, ob das alles Nebenwirkungsfrei ist. Wenn es so einfach lösbar ist, warum wird es dann nicht in Django gemacht?
Nein ist es nicht, stichwort CSRF-Token und spaß wie anon vs logged in user… Willkommen in der Welt von Http -- Caching in der Form geht einfach nicht…
Antworten