2012-07-23 57 views
2

在Django的Python开源代码很多次,我已经看到了这样的哪一种检查请求条件的方法更好?

if request.META and 'HTTP_REFERER' in request.META: 

的情况同样地,我已经看到了这两个如果条件还

if request.POST and 'next' in request.POST: 
if request.GET and 'next' in request.GET: 

我认为,唯一的条件是足矣检查这些情况下的条件是否如

if 'HTTP_REFERER' in request.META: 
if 'next' in request.POST: 
if 'next' in request.GET: 

那么为什么大多数时间人们使用早一次,是否就像双重检查或有一些情况下,第一次双重检查条件可能会有用,而后来的单一检查条件可能会失败?

回答

2

来来达到的,我只是grepped整个(当前的git)源django,并没有发现你提到的所有三个条件中的一个。

而你完全正确,只要有一个条件就足够了只要,因为你可以假设所有三个字典都被设置。看着django代码,我相信你可以假设。

编辑django documentation也建议这些字典将始终设置。

2

有一个(假设的)情况下您的解决方案将失败:

>>> request.POST = None 
>>> 'next' in request.POST 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: argument of type 'NoneType' is not iterable 

但如果你可以肯定的是request.POST永远不会None,那么你的解决方案将是确定。

它只是在空字典的情况下慢一点,因为如果(快速)空测试已经失败,则可以跳过if 'foo' in request.POST检查。另一方面,如果字典不是空的,速度会更快。

>>> import timeit 
>>> timeit.timeit(setup="a = {}", stmt="if a and 'next' in a: pass") 
0.028279806566242852 
>>> timeit.timeit(setup="a = {}", stmt="if 'next' in a: pass") 
0.04539217556517272 
>>> timeit.timeit(setup="a = {'foo':'bar'}", stmt="if a and 'next' in a: pass") 
0.07471092295071458 
>>> timeit.timeit(setup="a = {'foo':'bar'}", stmt="if 'next' in a: pass") 
0.045236056421884996 
>>> timeit.timeit(setup="a = {'next':'bar'}", stmt="if a and 'next' in a: pass") 
0.0851067469988891 
>>> timeit.timeit(setup="a = {'next':'bar'}", stmt="if 'next' in a: pass") 
0.0520663758715898 

所以我想这是一个微型优化问题。在这种情况下,我调用了Python的Zen:显式比隐式更好。的

+0

我不这么认为request.POST可以是None,除非有人明确地给它赋值None。 – 2012-07-23 07:52:04

+0

MichałGórny支持您的观点。 @PiyusG否则说。我不确定谁是对的:) – 2012-07-23 07:56:33

+0

他说的参数值是None,而不是request.POST本身。它可以是{}但不是无我猜...所有POST和GET都只是查询字典本身的实例所以它们不能是无自己的。 – 2012-07-23 08:01:14

8

它只能通过检查
request.META.get('HTTP_REFERER')
request.REQUEST.get('next')
,而不是检查它request.POSTrequest.GET

+2

我不记得django是否有任何魔力,但它将如何处理'?next ='(即空值)? – 2012-07-23 07:43:05

+1

在GET请求类型request.REQUEST.get('next')会返回你''if?next =是否有其他它会给你没有 – PiyusG 2012-07-23 07:47:51

+0

Python会给你'false'为空值,而检查键会给你是真的。 – 2012-07-23 08:23:05

相关问题