我有一段code
。谁能帮助我了解这段代码中究竟发生了什么?
特别是self.request.GET.get
和page < 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 :(得分:3)
self.request.GET
由webapp2框架通过实现get()
的类提供。它为您的代码提供对包含与HTTP请求一起发送的任何查询字符串参数的字典的访问,例如,一个URL,如:
http://localhost/resource?page=1&items_per_page=20
在查询字符串中有两个参数:page
和items_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 < 1
将为True
,则True and 1
将评估为1 - 因此将1用作页面值。任何值&gt; = 1都会导致page < 1
为False
,因此or
子句将是表达式的值。
这可以用更加可读的方式重写:
if page < 1:
page = 1
或者像这样:
page = 1 if page < 1 else page
更清楚地表明了代码的意图。
答案 1 :(得分:0)
@mhawke发布了一个很好的答案,但我仍然想稍微扩展一下。
请求对象的Here is the webapp2 documentation。我强烈建议您查看该请求以及请求的Webob documentation,因为webapp2请求和响应来自Webob框架(请继续查看响应文档,同时您还可以查看它)。
需要注意的一点是,GET数据是multi-dict,它也来自Webob框架。 multidict基本上是一个dict,但是一个键可以有多个值。以下是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()
如果您最终使用复选框提供一个键的值列表(&#34;选中所有适用的&#34;表单上的部分),该信息将派上用场。
因此,在您的代码中,self.request.GET.get('page', 1)
正在从multidict中检索page
的值,如果找不到该键,则返回1。密钥items_per_page
,from
和to
应用了相同的逻辑:检索该密钥的值,并返回未找到密钥时提供的默认值。
然后你有这两行:
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
事实上,如果你有机会,你应该改变那些代码,使其更具可读性。