在Flask中,什么是request.args以及如何使用?


73

我是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)

在这里,request.args.get()采用两个参数。请解释为什么要使用两个参数以及它的用途。

Answers:


117

根据flask.Request.args文件。

flask.Request.args
一个MultiDict,其中包含查询字符串的解析内容。(URL中问号后的部分)。

因此,MultiDict的args.get()is方法的原型如下:get()

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

更新:
在更新版本的flask(v1.0.x和v1.1.x)中, flask.Request.args它是ImmutableMultiDict(不可变的MultiDict),因此上述原型和特定方法仍然有效。


1
自从发布答案以来,事情可能已经改变。该文件说:By default an ImmutableMultiDict is returned from this function.
— 艾哈迈德·费尔多斯

23

@martinho是我自己使用Flask和Python的新手,我认为这里的先前答案是理所当然的,因为您对基本原理有很好的理解。如果您或其他观众不了解基本原理,我将提供更多背景信息以了解答案...

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

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

它只需要一个对象,即“字典”类型的对象(如先前的回答所述)。但是,该“字典”对象可以根据需要包含任意多个元素……(字典中有成对的元素,称为键,值)。

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


2

request.args是具有查询字符串的解析内容的MultiDict。从方法的文档中get:

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

如果请求的数据不存在,则返回默认值。如果提供了type并且是可调用的,则应转换该值,将其返回,或者在无法实现时引发ValueError。


4
您的链接已损坏。
— deterjan

只需更改网址中的版本号,例如werkzeug.pocoo.org/docs/0.14/datastructures/…–
— sr9yar

1

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

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'

1
这似乎确实是人们所期望的行为-您表示的有趣案例/行为是什么?
— 弥敦道

1
MultiDict.get(key, default=None, type=None)如果存储的值为“ false”,则不返回默认值。它查找密钥,如果在my_dict.keys()列表中找不到密钥,则它将返回提供的默认值。如果在密钥丢失或“假”的情况下需要默认值,则需要以下内容:"alternative" if not d.get("ext1", False) else d.get("ext1")
— blackfedora

哇,好几年了。就像上面提到的blackfedora一样,我的意思是我期望d.get("ex1", "alternative")并且d.get("ex2", "alternative")两者都返回替代值,因为它们的实际值是虚假的。
— Juha Untinen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.