哪种检查请求条件更好?

时间:2012-07-23 07:24:30

标签: python django request

很多时候在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条件,如

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

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

3 个答案:

答案 0 :(得分:6)

只有通过检查才能实现  request.META.get('HTTP_REFERER')
request.REQUEST.get('next')
 而不是检查 request.POST request.GET

答案 1 :(得分: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:显式优于隐式。

答案 2 :(得分:2)

我刚刚抓住了django的整个(当前git)来源,并且没有找到你提到的所有三个条件的单个出现。

你完全正确的条件是足够,因为你可以假设所有三个词典都已设定。看看django代码,我相信你可以认为。

编辑django documentation也表示将始终设置这些词典。