为什么 Flask 从 request.post 中删除 + 字符

问题描述 投票:0回答:2

我正在使用 Flask 开发微服务,但遇到了问题。当我从

request.form
读取数据时,发现所有加号 (+) 都已被删除。

我无法更改内容类型标头或发送数据的方式。

最小示例:

response = requests.post(
    url='http://0.0.0.0:6666/test',
    data='aaaaa+bbbbb',
    headers={"Content-Type": "application/x-www-form-urlencoded"},
)
from flask import Flask, request, Response

app = Flask(__name__)


@app.route('/test', methods=['POST'])
def update_text():
    print(request.form)

    return Response()


if __name__ == '__main__':
    app.run(port=6666)

当我运行此示例时,

request.form
ImmutableMultiDict([('aaaaa bbbbb', '')])
而不是
ImmutableMultiDict([('aaaaa+bbbbb', '')])

有什么方法可以在烧瓶侧纠正这个问题吗?最重要的是,为什么会发生这种情况?

致以诚挚的问候

python flask python-requests
2个回答
2
投票

您已指定使用

application/x-www-form-urlencoded
编码来传送内容。 URL 不能包含空格。根据url编码规则,
+
代表空格字符。如果您想要
+
,您可以使用
%2B

如果您实际上提交的是 HTML 表单,系统会为您处理此编码。当您使用直接

POST
请求测试它时,您需要自己执行编码。例如:

import urllib.parse

response = requests.post(
    url='http://0.0.0.0:6666/test',
    data=urllib.parse.quote('aaaaa+bbbbb'),
    headers={"Content-Type": "application/x-www-form-urlencoded"},
)

0
投票

我找到了解决方案:

@app.route('/test', methods=['POST'])
def update_text():
    data = request.get_data()
    print(request.data) # now I have correct data (with +) in this attr. Before without function above, this was empty. 

    return Response()


if __name__ == '__main__':
    app.run(port=6666)
© www.soinside.com 2019 - 2024. All rights reserved.