了解python中的请求参数

时间:2017-08-08 10:25:36

标签: python python-2.7 python-requests webapp2

我有一段code。谁能帮助我了解这段代码中究竟发生了什么?

特别是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]

2 个答案:

答案 0 :(得分: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 < 1将为True,则True and 1将评估为1 - 因此将1用作页面值。任何值&gt; = 1都会导致page < 1False,因此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_pagefromto应用了相同的逻辑:检索该密钥的值,并返回未找到密钥时提供的默认值。

然后你有这两行:

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

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