在 Flask 中,啥是“request.args”,它是如何使用的?

Posted

技术标签:

【中文标题】在 Flask 中,啥是“request.args”,它是如何使用的?【英文标题】:In Flask, what is "request.args" and how is it used?在 Flask 中,什么是“request.args”,它是如何使用的? 【发布时间】:2016-04-12 19:00:15 【问题描述】:

作为 Flask 初学者,我无法理解 request.args 是如何使用的。我在某处读到它用于返回查询字符串的值(如果我错了,请纠正我)以及request.args.get() 需要多少参数。

我知道当我必须存储提交的表单数据时,我可以使用fname = request.form.get("firstname")。这里只传递了一个参数,而下面的代码有两个参数。

@app.route("/")
def home():
    cnx = db_connect()
    cur = cnx.cursor()
    output = []

    page = request.args.get('page', 1)

    try:
        page = int(page)
        skip = (page-1)*4
    except:
        abort(404)
   
    stmt_select = "select * from posts limit %s, 4;"
    values=[skip]

    cur.execute(stmt_select,values)
    x=cur.fetchall()

    for row in reversed(x):
        data = 
           "uid":row[0],
           "pid":row[1],
           "subject":row[2],
           "post_content":row[3],
           "date":datetime.fromtimestamp(row[4]),
        
        output.append(data)
    
    next = page + 1
    previous = page-1
    if previous<1:
    previous=1
    return render_template("home.html", persons=output, next=next, previous=previous)

请解释为什么它需要两个参数,以及它的用途。

【问题讨论】:

【参考方案1】:

根据flask.Request.args文件。

flask.Request.argsMultiDict 包含查询字符串的解析内容。 (网址中问号后的部分)。

所以args.get()MultiDict的方法get(),其原型如下:

get(key, default=None, type=None)

在较新版本的flask(v1.0.x和v1.1.x)中,flask.Request.args是一个ImmutableMultiDict(一个不可变的MultiDict),所以上面的原型和具体方法仍然有效。

【讨论】:

自发布答案以来,情况可能已经改变。文档说:By default an ImmutableMultiDict is returned from this function. 要导入:从烧瓶导入请求【参考方案2】:

作为我自己使用 Flask 和 Python 的新手,我认为这里的其他一些答案认为你对基础知识有很好的理解是理所当然的。如果您或其他读者不知道,我会提供更多背景信息

...request.args 为您返回一个“字典”对象。 “字典”对象类似于 Python 中的其他集合类型的对象,因为它可以在一个对象中存储许多元素。因此,您的问题的答案

以及request.args.get() 需要多少个参数。

它只需要一个对象,一种“字典”类型的对象(如前面的答案中所述)。然而,这个“字典”对象可以根据需要包含任意数量的元素......(字典有成对的元素,称为键、值)。

除了“字典”之外,其他集合类型的对象将是“元组”和“列表”……您可以对这些对象和“数据结构”进行 google 搜索,以了解其他 Python 基础知识。这个答案基于 Python;我不知道这是否适用于其他编程语言。

【讨论】:

【参考方案3】:

在某些情况下,它有一些有趣的行为,需要注意:

from werkzeug.datastructures import MultiDict

d = MultiDict([("ex1", ""), ("ex2", None)])

d.get("ex1", "alternive")
# returns: ''

d.get("ex2", "alternative")
# returns no visible output of any kind
# It is returning literally None, so if you do:
d.get("ex2", "alternative") is None
# it returns: True

d.get("ex3", "alternative")
# returns: 'alternative'

【讨论】:

这似乎正是人们所期望的行为 - 您的意思是什么有趣的案例/行为? MultiDict.get(key, default=None, type=None) 在存储值为“falsey”的情况下不返回默认值。它查找键,如果在my_dict.keys() 列表中找不到键,则返回提供的默认值。如果您想要在密钥丢失或“错误”的情况下使用默认值,那么您需要类似:"alternative" if not d.get("ext1", False) else d.get("ext1") 哇,几年前。我的观点,就像上面提到的 blackfedora 一样,是我希望 d.get("ex1", "alternative")d.get("ex2", "alternative") 都返回替代值,因为它们的实际值是虚假的。 如果 "ex1" 不在 d 中或者是一个假值,则使用 d.get("ex1") or "alternative" 获得 "alternative"。 d.get("ex1", "alternative") 表示如果 "ex1" 不在 d 中,则将 "alternative" 作为默认值。【参考方案4】:

request.args 是一个MultiDict,其中包含查询字符串的解析内容。 来自documentation 的get 方法:

getkey, default=None, type=None

返回默认值,如果 请求的数据不存在。如果提供了类型并且是可调用的 应该转换值,返回它或引发一个 ValueError 如果是 不可能。

【讨论】:

您的链接已损坏。 只需要更改url中的版本号,像这样werkzeug.pocoo.org/docs/0.14/datastructures/…

以上是关于在 Flask 中,啥是“request.args”,它是如何使用的?的主要内容,如果未能解决你的问题,请参考以下文章

Python Flask request.args.get无法处理#请求参数[重复]

flask中的request

flask-get/post/线程隔离g对象/钩子函数

flask类装饰器

Flask中的request与response

11.3 Flask 视图,模板