Python请求-通过SSL获取数据的GET/POST会截断响应



例如,取此app.py并使用python3 -m flask run --cert=adhoc运行它。

from flask import Flask
app = Flask(__name__)
@app.route('/', methods=["GET", "POST"])
def hello_world():
return {"access_token": "aa" * 50000}

发送数据如何截断响应?

>>> import requests
>>> len(requests.post('https://127.0.0.1:5000/', verify=False).content)
100020
>>> len(requests.post('https://127.0.0.1:5000/', data={'a':'b'}, verify=False).content)
81920

PS 1:它在没有SSL的情况下正常工作;

PS2:GET产生相同的行为;

PS 3:卷曲产生正确的结果:

$ curl -s -k -X POST https://127.0.0.1:5000/ -H 'Content-Type: application/json' -d '{"a":"b"}' | wc -m
100020

PS4:我报告这是请求的github上的一个错误。

这是一个奇怪的问题,我承认我不完全确定我的答案是否在每个细节上都是正确的。但你可能需要向Flask报告这件事,而不是请求。。。

@app.route('/', methods=["GET", "POST"])
def hello_world():
print(f"hello_world: content_type: {request.content_type}, data: {request.data}")
return {"access_token": "aa" * 50000}

此代码响应两个

>>> len(requests.post('https://127.0.0.1:5000/', data={"a":"b"}, verify=False).content)

>>> len(requests.post('https://127.0.0.1:5000/', verify=False).content)

现在注释掉print()data=...请求得到一个异常:

raise ChunkedEncodingError(e)
requests.exceptions.ChunkedEncodingError: ("Connection broken: ConnectionResetError(104, 'Connection reset by peer')", ConnectionResetError(104, 'Connection reset by peer'))

怀疑Flask只会按需读取请求中的数据。但是使用SSL,读取数据会影响加密(例如通过密码块链接(。因此,在完全读取请求之前发送响应会导致编码问题。

因此,在发送答复之前,请先阅读您从请求中获得的所有数据。

最新更新