【问题标题】:Understanding request parameters in python理解python中的请求参数
【发布时间】:2017-08-08 10:25:35
【问题描述】:

我有以下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]

【问题讨论】:

  • 什么是self.request
  • 我也在寻找同样问题的答案。 @Fejs

标签: python python-2.7 python-requests webapp2


【解决方案1】:

self.request.GET由webapp2框架通过实现get()的类提供。它使您的代码可以访问包含随 HTTP 请求发送的任何查询字符串参数的字典,例如一个 URL,例如:

http://localhost/resource?page=1&amp;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

如果用户提供的 page 值小于 1,page &lt; 1 将是 True,然后 True and 1 将评估为 1 - 因此 1 用作 page 的值。任何 >=1 的值都将导致 page &lt; 1 成为 False,因此 or 子句将是表达式的值。

这可以用更易读的方式重写,如下所示:

if page < 1:
    page = 1

或者像这样:

page = 1 if page < 1 else page

这更清楚地表明了代码的意图。

【讨论】:

  • 我没有话要感谢你。这就是我能说的。直接接受了你的回答。很好的解释。 @mhawke 你能解释一下我下一个 cmets 中的台词吗?
  • query = Task.query(Task.start_datetime >= from_date,祖先=user_key)
  • query = query.filter(Task.entity_ids.IN(entity_ids))
  • 任务,光标,x = query.fetch_page( items_per_page, offset=(items_per_page*page)-items_per_page)
  • 我对“ancestor”、“.IN(entity_ids)”和“query.fetch_page”的整个代码更感兴趣。
【解决方案2】:

@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()

如果您最终使用复选框为一个键提供值列表(表单上的“检查所有适用”部分),那么该信息将派上用场。

因此,在您的代码中,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

事实上,如果您有机会,您应该更改该代码以使其更具可读性。

【讨论】:

    猜你喜欢
    • 2013-07-20
    • 2013-07-20
    • 2018-05-19
    • 2017-02-17
    • 2021-01-18
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多