2017-08-08 99 views
0

我有以下一段code。任何人都可以請幫我理解這段代碼中究竟發生了什麼?瞭解python中的請求參數

特別是,self.request.GET.getpage < 1 and 1 or page部分。

def get(self, *v, **kv): 
    page = int(self.request.GET.get('page', 1)) 
    page = page < 1 and 1 or page 
    items_per_page = int(self.request.GET.get('items_per_page', 500)) 
    items_per_page = items_per_page < 1 and 500 or items_per_page 
    from_date = convert_to_utc(parse_datetime(self.request.GET.get('from')))[0] \ 
       or datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0) 
    to_date = convert_to_utc(parse_datetime(self.request.GET.get('to')))[0] 
+0

什麼是'self.request'? – Fejs

+0

我也在尋找同樣問題的答案。 @Fejs – HamidArrivy

回答

3

self.request.GET由webapp2的框架,通過在其中get()被實現的類提供。它使您的代碼可以訪問包含隨HTTP請求一起發送的任何查詢字符串參數的字典,例如的URL,例如:

http://localhost/resource?page=1&items_per_page=20

在查詢字符串兩個參數:分別pageitems_per_page與值1和20。 webapp2處理URL並嚮應用程序提供包含這些參數的字典,例如self.request.GET可能看起來像這樣:

{'page': 1, 'items_per_page': 20, ...} 

self.request.GET.get()執行在字典用於所請求的密鑰的查找(例如page),並且如果密鑰是存在於所述詞典返回它的值。如果鍵不在字典中,則返回默認值;對於self.request.GET.get('page', 1),如果URL不包含page查詢參數,則默認值爲1。詳情請參閱dict.get()


下一位是默認爲第1頁討厭的方式,如果在查詢字符串提供的值小於1:

page = page < 1 and 1 or page 

可以這樣寫:

page = ((page < 1) and 1) or page 

如果頁面的用戶提供的值小於1,page < 1True,然後True and 1將評估爲1 - 等1用作頁的值。任何值> = 1將導致page < 1False,因此or子句將是該表達式的值。

這能夠以更可讀的方式被重寫如下:

if page < 1: 
    page = 1 

或這樣的:

page = 1 if page < 1 else page 

其中更清楚地示出代碼的意圖。

+0

我沒有話語​​要謝謝你。這就是我所能說的。直接接受你的答案。非常好的解釋。 @mhawke 你能否在我的下一個評論中解釋一下這幾行? – HamidArrivy

+0

查詢= Task.query(Task.start_datetime> = FROM_DATE,祖先= user_key) – HamidArrivy

+0

查詢= query.filter(Task.entity_ids.IN(entity_ids)) – HamidArrivy

0

@mhawke發佈了一個很好的答案,但我仍然想擴大一點。

Here is the webapp2 documentation爲請求對象。我強烈建議考慮看看那個,也是Webob documentation的要求,因爲webapp2的請求和響應從的WebOb框架內採取(繼續前進,在響應文檔看看,而你在它)。

要注意的重要一點是,GET數據爲multi-dict,這也來自於框架的WebOb。 multidict基本上是一個字典,但一個鍵可以有多個值。下面是來自webapp2的文檔的例子:

request = Request.blank('/test?check=a&check=b&name=Bob') 

# The whole MultiDict: 
# GET([('check', 'a'), ('check', 'b'), ('name', 'Bob')]) 
get_values = request.GET 

# The last value for a key: 'b' 
check_value = request.GET['check'] 

# All values for a key: ['a', 'b'] 
check_values = request.GET.getall('check') 

# An iterable with all items in the MultiDict: 
# [('check', 'a'), ('check', 'b'), ('name', 'Bob')] 
request.GET.items() 

這些信息會派上用場,如果你最終使用複選框以一個鍵(「選擇所有適用的」一節中的窗體上)提供值的列表。

在你的代碼

所以,self.request.GET.get('page', 1)從multidict檢索用於page值,返回1,如果該鍵沒有找到。對於密鑰items_per_page,fromto應用相同的邏輯:檢索該密鑰的值,並返回未找到該密鑰時提供的默認值。

那麼你有以下兩行:

page = page < 1 and 1 or page 

items_per_page = items_per_page < 1 and 500 or items_per_page 

由於@mhawke說,這是說的一個討厭的方式:,

if page < 1: 
    page = 1 
if items_per_page < 1: 
    items_per_page = 500 

事實上,如果你有機會改變這些代碼,使其更具可讀性。