Wie der Titel fragt, warum haben die Django-Leute beschlossen, die Anfrage zu implementieren. POST-Objekt mit einem Querydict (was natürlich wiederum das Ganze unveränderlich macht?)
Ich weiß, dass Sie es ändern können, indem Sie eine Kopie der Postdaten erstellen
post = request.POST.copy()
aber warum das? Sicherlich wäre es einfacher, das Ding trotzdem veränderlich zu machen? Oder wird es auch aus einem anderen Grund verwendet, der Probleme verursachen könnte?
request.POST
mehr Daten übermittelt wurden als tatsächlich.Antworten:
Es ist ein bisschen ein Rätsel, nicht wahr? Mehrere oberflächlich plausible Theorien erweisen sich bei der Untersuchung als falsch:
Damit das
POST
Objekt keine Mutationsmethoden implementieren muss? Nein: DasPOST
Objekt gehört zumdjango.http.QueryDict
Klasse , die implementiert ein vollständiger Satz von Mutationsverfahren einschließlich__setitem__
,__delitem__
,pop
undclear
. Es implementiert Unveränderlichkeit, indem ein Flag überprüft wird, wenn Sie eine der Mutationsmethoden aufrufen. Und wenn Sie diecopy
Methode aufrufen , erhalten Sie eine andereQueryDict
Instanz mit aktiviertem veränderlichen Flag.Zur Leistungsverbesserung? Nein: Die
QueryDict
Klasse erhält keinen Leistungsvorteil, wenn das veränderbare Flag deaktiviert ist.Damit das
POST
Objekt als Wörterbuchschlüssel verwendet werden kann? Nein:QueryDict
Objekte sind nicht hashbar.Damit die
POST
Daten träge erstellt werden können (ohne die gesamte Antwort zu lesen), wie hier behauptet ? Ich sehe keinen Beweis dafür im Code: soweit ich das beurteilen kann, die Gesamtheit der Antwort wird immer gelesen, entweder direkt oder überMultiPartParser
fürmultipart
Antworten.Um Sie vor Programmierfehlern zu schützen? Ich habe dies behauptet gesehen, aber ich habe nie eine gute Erklärung dafür gesehen, was diese Fehler sind und wie Unveränderlichkeit Sie vor ihnen schützt.
In jedem Fall
POST
ist nicht immer unveränderlich : Wenn die Antwort istmultipart
, dannPOST
ist veränderlich. Dies scheint den Kibosh auf die meisten Theorien zu setzen, an die Sie vielleicht denken. (Es sei denn, dieses Verhalten ist ein Versehen.)Zusammenfassend kann ich in Django keine klare Begründung dafür sehen, dass das
POST
Objekt für Nichtanfragen unveränderlich istmultipart
.quelle
Wenn die Anfrage das Ergebnis einer Django-
form
Übermittlung war, ist es für POST sinnvollimmutable
, die Integrität der Daten zwischen der Übermittlung des Formulars und der Validierung des Formulars sicherzustellen . Wenn die Anfrage jedoch nicht über eine Django-form
Übermittlung gesendet wurde , erfolgt POST,mutable
da keine Formularvalidierung erfolgt.Sie können immer so etwas tun: (gemäß dem Kommentar von @ leo-the-manic )
quelle
Update :
Gareth Rees hatte Recht, dass die Punkte 1 und 3 in diesem Fall nicht gültig waren. Obwohl ich denke, dass Punkt 2 und 4 noch gültig sind, werde ich diese hier belassen.
(Mir ist aufgefallen, dass das
request.POST
Objekt von Pyramid (Pylon) und Django eine Form von istMultiDict
. Vielleicht ist es eine üblichere Praxis, alsrequest.POST
unveränderlich zu machen.)Ich kann nicht für die Django-Leute sprechen, obwohl es mir aus folgenden Gründen so scheint:
Leistung . unveränderliche Objekte sind "schneller" als veränderbare, da sie wesentliche Optimierungen ermöglichen. Ein Objekt ist unveränderlich. Dies bedeutet, dass wir ihm zum Zeitpunkt der Erstellung Speicherplatz zuweisen können und sich der Speicherplatzbedarf nicht ändert. Es hat auch Dinge wie Kopiereffizienz und Vergleichseffizienz aufgrund dessen.Bearbeiten : Dies ist nicht der Fall,QueryDict
wie Gareth Rees betonte.request.POST
sollte anscheinend keine Aktivität auf der Serverseite erforderlich sein, um die Daten der Anforderung zu ändern . Und daher sind unveränderliche Objekte besser geeignet, ganz zu schweigen davon, dass sie einen erheblichen Leistungsvorteil haben.Unveränderliche Objekte können alsBearbeiten : Mein Fehler, unveränderlich bedeutet nicht direkt Hashable ; Hash- Objekte sind jedoch normalerweise auch unveränderlich .dict
Schlüssel verwendet werden, was vermutlich irgendwo in Django sehr nützlich sein könnte.request.POST
(insbesondere an Plugins von Drittanbietern und Outs), können Sie davon ausgehen, dass dieses Anforderungsobjekt des Benutzers unverändert bleibt.In gewisser Weise sind diese Gründe auch generische Antworten auf "unveränderlich gegen veränderlich?" Frage. Ich bin sicher, dass es im Fall Django viel mehr Überlegungen zum Design gibt als oben.
quelle
sessions
kurzlebige Möglichkeit, Daten zwischen Staaten abzurufen und zu ändern.POST
es sich um einQueryDict
Objekt handelt und diese Objekte keinen Leistungsvorteil erhalten, wenn sie unveränderlich sind. Und Ihr Punkt (3) kann nicht die Antwort sein, daQueryDict
Objekte nicht hashbar sind und daher nicht als Wörterbuchschlüssel verwendet werden können.QueryDict
bevor ich antwortete.requests.POST._mutable = True; requests.POST['foo'] = 'bar'; request.POST._mutable = False
Ich mag es, wenn es standardmäßig unveränderlich ist. Wie bereits erwähnt, können Sie es bei Bedarf veränderbar machen, müssen dies jedoch explizit angeben. Es ist wie "Ich weiß, dass ich mein Formular zum Debuggen zu einem Albtraum machen kann, aber ich weiß, was ich jetzt tue."
quelle
Ich habe dies in einem Kommentar zu Stack Answer https://stackoverflow.com/a/2339963 gefunden
quelle
Bitte beachten Sie:
multipart
Anfragen sind seit Django 1.11 https://github.com/django/django/blob/stable/1.11.x/django/http/multipartparser.py#L292 unveränderlichSie waren in früheren Versionen veränderlich.
quelle