我正在使用 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', '')])
。
有什么方法可以在烧瓶侧纠正这个问题吗?最重要的是,为什么会发生这种情况?
致以诚挚的问候
您已指定使用
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"},
)
我找到了解决方案:
@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)