【问题标题】:Python Flask - request.data.get [duplicate]Python Flask - request.data.get [重复]
【发布时间】:2020-07-03 14:16:33
【问题描述】:

我被要求理解和维护类似以下代码块的代码。

@app.route("/api/v1/users/register/", methods=["POST"])
def register():
    data = {
        "lat": request.data.get("lat", ""),
        "lon": request.data.get("lon", ""),
        "is_bl_allowed": request.data.get("is_bl_allowed", 1),
        "is_loc_allowed": request.data.get("is_loc_allowed", 1),
        "is_bl_on": request.data.get("is_bl_on", 1),
        "is_loc_on": request.data.get("is_loc_on", 1)
    }

进口是

from flask import make_response
from flask import request, jsonify
import requests

我认为烧瓶请求使用 get_json 或 form.get 来检索 POST 请求数据。 我不确定在此代码块中检索的是什么。我无权访问调用此 API 的代码。 如果有人能解释 request.data.get 做了什么,它的返回值是什么以及为什么它需要 2 个参数,那就太棒了。

提前致谢。

【问题讨论】:

    标签: python rest flask request


    【解决方案1】:

    对于这样的发布请求,request.data 属性就像一本字典。如果你在 python 中有一个字典,你可以使用get 来指定一个你想要字典中的值的键,例如:

    example = {"key": "value"}
    example.get("key")  # gives you "value"
    

    使用get 和简单地使用example["key"] 的区别在于你不会得到并且缺少密钥的错误:

    example = {"key": "value"}
    example.get("other")  # gives you None
    example["other"]  # raises KeyError
    

    您也可以(如您的示例)为缺少的键提供默认值:

    example = {"key": "value"}
    example.get("key")  # gives you "value"
    example.get("other", "different value")  # gives you "different value"
    

    因此,对于您的终点,代码尝试使用 data.get 从发布请求中获取一系列数据点,并使用默认值(空字符串或 1)作为缺失值。

    【讨论】:

    • 谢谢 这是否意味着 "request.user.get("xxxxxx") 也是预定义的?我认为这里发生了某种形式的函数重载。但是我现在不确定。
    • 您的示例不包含与用户相关的任何内容,因此我不能 100% 确定,但很可能是相似的:可以使用 get 访问的类似字典的行为。
    【解决方案2】:

    Flask 为 POST 请求设置 request.datarequest.form,而不是两者。

    • 如果 Flask 理解 POST 请求,则会填充 request.form
    • 如果 Flask 无法充分理解请求以将值放入 request.form,则填充 request.data。这可能是 Flask 问题,也可能是由于缺少或不满意 Content-type 标头。

    因此,您不能将此代码重构为使用 .form,因为它将为空。

    两者都是字典,因此您可以使用可选的.get() 访问方式并提供默认值作为第二个参数。

    【讨论】:

      猜你喜欢
      • 2019-10-21
      • 2014-04-17
      • 2021-05-22
      • 2023-01-07
      • 2016-09-04
      • 2022-01-24
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多