2012-07-23 54 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

相關問題