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?
3 Antworten
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.
Leeren Sie am Ende jeder Anforderung den Cache
@app.teardown_request
def teardown(exc):
A.x = {}
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.
Verwandte Fragen
Neue Fragen
python
Python ist eine dynamisch typisierte Mehrzweck-Programmiersprache mit mehreren Paradigmen. Es wurde entwickelt, um schnell zu lernen, zu verstehen, zu verwenden und eine saubere und einheitliche Syntax durchzusetzen. Bitte beachten Sie, dass Python 2 ab dem 01.01.2020 offiziell nicht mehr unterstützt wird. Fügen Sie für versionenspezifische Python-Fragen das Tag [python-2.7] oder [python-3.x] hinzu. Wenn Sie eine Python-Variante (z. B. Jython, PyPy) oder eine Bibliothek (z. B. Pandas und NumPy) verwenden, fügen Sie diese bitte in die Tags ein.