2017-08-08 102 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 

事实上,如果你有机会改变这些代码,使其更具可读性。