正如标题所示,为什么Django家伙决定使用querydict实现request.POST对象(当然,这反过来会使整个事情变得不可变?)
我知道你可以通过制作帖子数据的副本来弥补它
post = request.POST.copy()
Run Code Online (Sandbox Code Playgroud)
但为什么这样呢?当然,只要让事情变得可变就更简单了?或者它是否也被用于其他可能导致问题的其他原因?
Gar*_*ees 128
这有点神秘,不是吗?一些表面上看似合理的理论在调查中被证明是错误的:
那么POST
对象不必实现变异方法?编号:该POST
对象所属的django.http.QueryDict
类,它实现了全套的突变方法,包括__setitem__
,__delitem__
,pop
和clear
.它通过在调用其中一种变异方法时检查标志来实现不变性.当你调用copy
方法时,你会得到另一个QueryDict
打开了mutable标志的实例.
为了提高性能?否:QueryDict
当关闭可变标志时,该类不会获得性能优势.
这样POST
对象可以用作字典键吗?不:QueryDict
对象不可清洗.
这样声明POST
可以懒惰地构建数据(不承诺读取整个响应),如此处所声明的那样?我没有看到这方面的证据代码:据我所知,整个反应总是读,无论是直接或通过MultiPartParser
对multipart
反应.
为了防止编程错误?我已经看到了这个声称,但我从来没有看到过这些错误的好解释,以及不变性如何保护你免受它们的攻击.
在任何情况下,POST
是不是永远不变的:当响应multipart
,则POST
是可变的.这似乎把你可能想到的大多数理论都放在了一边.(除非这种行为是疏忽.)
总之,我认为 Django 没有明确的理由说明POST
对象对于非multipart
请求是不可变的.
un3*_*33k 79
如果请求是Django form
提交的结果,那么POST immutable
确保表单提交和表单验证之间的数据完整性是合理的.但是,如果请求未通过Django 提交发送,则POST是因为没有表单验证.form
mutable
你总是可以这样做:(根据@ leo-the-manic的评论)
# .....
mutable = request.POST._mutable
request.POST._mutable = True
request.POST['some_data'] = 'test data'
request.POST._mutable = mutable
# ......
Run Code Online (Sandbox Code Playgroud)
更新:
Gareth Rees说得对,第1点和第3点在这种情况下无效.虽然我认为第2点和第4点仍然有效,但我会留下这些论文.
(我注意到request.POST
金字塔(Pylon)和Django 的对象都是某种形式的MultiDict
.所以也许它比request.POST
不可变的更常见.)
我不能代表Django的人,虽然在我看来它可能因为以下一些原因:
QueryDict
Gareth Rees指出的情况.request.POST
,似乎服务器端的任何活动都不需要改变请求的数据.因此,不可变对象更适合,更不用说它们具有很大的性能优势.dict
键,我认为在Django的某个地方可能非常有用.request.POST
(特别是第三方插件和外出)时,您可以预期来自用户的此请求对象将保持不变.在某种程度上,这些原因也是"不可变与可变"的通用答案.题.我确信在Django案例中有更多的设计考虑因素.
归档时间: |
|
查看次数: |
38953 次 |
最近记录: |