Flask request参数如何获取与处理?

99ANYc3cd6
预计阅读时长 22 分钟
位置: 首页 参数 正文

确保你已经在 Flask 应用中导入了 request

flask request 参数
(图片来源网络,侵删)
from flask import Flask, request
app = Flask(__name__)

request.args - 查询字符串参数

当 URL 中包含 后面的键值对时,这些参数就是查询字符串参数,在 http://127.0.0.1:5000/search?keyword=flask&page=1 中,keywordpage 就是查询参数。

  • 获取方式request.args 是一个 ImmutableMultiDict 对象,可以像字典一样操作。
  • 特点:一个键可以对应多个值(?key=1&key=2)。

常用方法:

  1. get(key, default=None, type=None) (推荐)

    • 获取指定 key 的第一个值。
    • key 不存在,返回 default 值(默认为 None)。
    • type 用于指定值的类型,Flask 会尝试转换它(如 int, float, str)。
    @app.route('/search')
    def search():
        # 获取 keyword 参数,如果不存在则返回空字符串
        keyword = request.args.get('keyword', '') 
        # 获取 page 参数,并尝试转换为整数,如果转换失败或不存在则默认为 1
        page = request.args.get('page', 1, type=int)
        return f"Searching for '{keyword}', page {page}"
  2. getlist(key)

    • 获取指定 key 的所有值,返回一个列表。
    • 当一个参数有多个值时非常有用。
    @app.route('/tags')
    def tags():
        # 假设 URL 是 /tags?tech=flask&tech=python&web
        technologies = request.args.getlist('tech')
        # technologies 将会是 ['flask', 'python']
        # 对于没有值的参数,getlist 会返回空列表
        other_tags = request.args.getlist('web')
        # other_tags 将会是 []
        return f"Technologies: {technologies}, Other tags: {other_tags}"
  3. to_dict()

    flask request 参数
    (图片来源网络,侵删)
    • 将所有查询参数转换为普通 Python 字典。
    @app.route('/params_dict')
    def params_dict():
        params = request.args.to_dict()
        # params 将会是 {'keyword': 'flask', 'page': '1'}
        return str(params)

request.form - 表单数据

当客户端通过 HTML 表单(method="post")提交数据时,数据会存放在 request.form 中。

  • 获取方式:同样是 ImmutableMultiDict 对象,用法与 request.args 完全相同。

示例:

HTML (templates/login.html):

<form action="/login" method="post">
    <label for="username">Username:</label>
    <input type="text" id="username" name="username"><br>
    <label for="password">Password:</label>
    <input type="password" id="password" name="password"><br>
    <input type="submit" value="Login">
</form>

Flask 视图:

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        # 使用 .get() 获取表单数据,防止 KeyError
        username = request.form.get('username')
        password = request.form.get('password')
        if username and password:
            return f"Welcome, {username}!"
        else:
            return "Please fill out both fields."
    # GET 请求时显示登录页面
    return render_template('login.html')

request.json - JSON 数据

当客户端发送 Content-Type: application/json 的请求体时,Flask 会自动解析它,并将其内容存放在 request.json 中。

  • 获取方式request.json 是一个 Python 字典。
  • 重要:如果请求体不是有效的 JSON,或者 Content-Type 不正确,访问 request.json 会返回 None 并设置 400 错误。

示例:

使用 curl 发送请求:

curl -X POST \
  http://127.0.0.1:5000/api/user \
  -H "Content-Type: application/json" \
  -d '{"name": "Alice", "age": 30}'

Flask 视图:

@app.route('/api/user', methods=['POST'])
def create_user():
    # 检查请求是否包含 JSON 数据
    if request.is_json:
        data = request.json  # data 是一个字典: {'name': 'Alice', 'age': 30}
        name = data.get('name')
        age = data.get('age')
        # 在这里处理数据,例如保存到数据库
        return f"User {name} (age {age}) created successfully!", 201
    else:
        return "Request must be JSON.", 400

request.values - 查询字符串和表单的并集

request.valuesrequest.argsrequest.form 的并集,它会优先查找 request.form 中的值,然后再查找 request.args 中的值。

  • 获取方式:用法与 argsform 相同。
# 假设 URL 是 /profile?id=123 (来自 request.args)
# 并且表单中有一个字段 name="John" (来自 request.form)
@app.route('/profile')
def profile():
    # form 和 args 中都有 'id',它会获取 form 中的 'id'
    # form 中没有 'id',它会获取 args 中的 'id'
    user_id = request.values.get('id') 
    name = request.values.get('name')
    return f"Profile ID: {user_id}, Name: {name}"

request.cookies - Cookie 数据

用于获取客户端发送过来的 Cookie。

  • 获取方式request.cookies 是一个字典。
@app.route('/')
def index():
    # 获取名为 'username' 的 cookie
    username = request.cookies.get('username')
    if username:
        return f"Hello again, {username}!"
    else:
        return "Hello, new visitor!"

request.headers - 请求头信息

用于获取 HTTP 请求头。

  • 获取方式request.headers 是一个类似字典的对象,不区分大小写。
@app.route('/headers')
def headers():
    # 获取 User-Agent 头
    user_agent = request.headers.get('User-Agent')
    # 获取 Host 头
    host = request.headers.get('Host')
    return f"Your browser is: {user_agent}<br>Host: {host}"

其他有用的 request 属性

属性 描述
request.method 获取 HTTP 请求方法,如 'GET', 'POST'
request.url 获取完整的请求 URL,包括查询字符串。
request.base_url 获取不带查询字符串的基础 URL。
request.endpoint 获取请求对应的 Flask 端点名称(视图函数名)。
request.path 获取 URL 的路径部分,不包括查询字符串。
request.files 获取上传的文件。request.files['file'] 会返回一个 FileStorage 对象。
request.data 获取原始请求体(字节流),在处理非表单、非 JSON 数据时有用。

总结与最佳实践

  1. 使用 .get() 方法:始终使用 request.args.get()request.form.get() 而不是直接使用 [] 访问,这样可以避免当参数不存在时抛出 KeyError 异常,并能提供默认值,使代码更健壮。

  2. 指定类型:对于数字、日期等参数,使用 request.args.get('key', type=int),让 Flask 自动帮你转换和验证,避免手动转换出错。

  3. 区分数据来源

    • URL 中的参数用 request.args
    • HTML 表单用 request.form
    • API 的 JSON 数据用 request.json
  4. 注意 MultiDictargs, form, values, cookies 都是 MultiDict,这意味着一个键可以有多个值,如果确定只有一个值,用 .get();如果可能有多个值,用 .getlist()

掌握了这些,你就可以在 Flask 应用中灵活地处理所有类型的客户端请求了。

-- 展开阅读全文 --
头像
phpqrcode png参数如何设置?
« 上一篇 01-05
nvidia shield 参数
下一篇 » 01-05

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]