Ich habe ein statisches Klassenattribut, das in derselben http-Anforderung geändert wird.

class A:
  x = {}

  def fun(k,v):
    A.x[k] = v

Mein Problem ist, dass bei einer weiteren http-Anfrage der letzte Wert der vorherigen Anfrage bestehen bleibt.

Ich benutze Django über Apaches Mod WSGI.

Wie kann ich sicherstellen, dass der statische Wert in derselben Anforderung erhalten bleibt, jedoch nicht in einer anderen Anforderung?

0
Oussama Jilal 11 Aug. 2015 im 12:15

3 Antworten

Beste Antwort

Inspiriert von der Antwort von muddyfish habe ich die process_response einer Middleware implementiert

import A

class ClearStaticMiddleware(object):
  def process_response(self, request, response):
    A.x = {}
    return response

Vielen Dank für Ihre Antworten.

-2
Oussama 11 Aug. 2015 im 10:11

Leeren Sie am Ende jeder Anforderung den Cache

@app.teardown_request
def teardown(exc):
    A.x = {}
-1
muddyfish 11 Aug. 2015 im 09:19

Der springende Punkt bei statischen Variablen ist, dass sie in der Klasse bestehen bleiben und nicht in den Instanzen, die zur Verarbeitung einer bestimmten Anforderung verwendet werden. Dies ist gefährlich, wenn Bedrohungs- oder ereignisbasierte Server verwendet werden, da die statische Variable nicht nur für die nächste Anforderung, sondern auch für alle parallel behandelten Anforderungen freigegeben wird.

Ich gehe davon aus, dass die Klasse A hier eine klassenbasierte Ansicht ist. In diesem Fall können Sie Ihr Attribut stattdessen in ein Instanzattribut ändern:

class A(…):
    def __init__(self, *args, **kwargs):
        super()
        self.x = {}

    def foo(k, v):
        self.x[k] = v

Da klassenbasierte Ansichten für jede Anforderung, die sie bedienen, erneut instanziiert werden, wird der Wert nicht in andere Anforderungen übertragen.

1
patrys 11 Aug. 2015 im 09:59