在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中问号后的部分)。

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

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

更新
在更新版本的flask(v1.0.xv1.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

getkey,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.