POST 请求参数返回 "none"

POST request parameters returning "none"

我有以下 POST 请求:

import requests

payload = {'key1':'value1'}
r = requests.post('http://127.0.0.1:5000/test', params=payload)
print(r.url)
print(r.text)

我的烧瓶应用程序尝试 return 来自 key1 的值:

from flask import Flask, request

app = Flask(__name__)

@app.route('/test', methods = ["GET", "POST"])
def query_params():
    val = request.args.get("key1")
    return val

要去 http://127.0.0.1:5000/test returns

TypeError TypeError: The view function for 'query_params' did not return a valid response. The function either returned None or ended without a return statement.

烧瓶调试器的输出:

127.0.0.1 - - [21/May/2022 21:47:17] "POST /test?key1=value1 HTTP/1.1" 200 -

我在这里错过了什么?非常感谢您的帮助!

干杯, 马里奥

当您从浏览器访问 http://127.0.0.1:5000/test 时,它是一个 GET 请求,并且您的请求中没有传递任何参数。

如果您访问 http://127.0.0.1:5000/test?key1=value1,将打印您预期的输出。

关于您使用的 requests.post 片段:如果您看到 documentationparams 通常用于 GET 请求,POSTS 得到 data 参数。但似乎您的代码有效,它将参数附加到请求(就像在 GET 中发生的那样)并发出 POST 请求。有趣的发现!

r = requests.post('http://127.0.0.1:8000/test', data=payload)

如果参数不存在,您可以使用“后备”值来增强您的代码:

@app.route('/test', methods = ["GET", "POST"])
def query_params():
    val = request.args.get("key1", "parameter was not provided")
    return val

总而言之,我认为您应该决定提交数据的请求方法应该是 GET 还是 POST,然后相应地更新您的代码(如果是 GET,您的代码片段就可以了,如果您应该使用 POST,尝试将 params 切换为 data 然后你的烧瓶路由代码可以使用新的有效负载“格式”。

更新代码 以“如果 Flask 应用程序收到带有特定 key:value 对的 POST 请求,则启动 python 脚本”:

@app.route('/test', methods = ["GET", "POST"])
def query_params():
    if request.method == 'POST':
        val = request.args.get("the expected key", "parameter was not provided")
        if val == "the expected value":
            # do the things you want to do
            return "processing done!"