Flask / Flask-restful:强制/更正/覆盖不正确的POST请求内容类型标头

时间:2019-04-25 10:32:05

标签: flask flask-restful

我正在发送的封闭源应用程序有问题 标头中的内容类型不正确。

我收到的数据为“内容类型:application / x-www-form-urlencoded”

我应该以“内容类型:application / json”的形式接收它

以下是Flask和Flask-restful的Flask服务器代码

from flask import Flask
from flask_restful import reqparse, abort, Api, Resource, request

TEST_PROXY = "0.0.0.0"
TEST_PROXY_PORT = 1885
DEBUG = True

app = Flask(__name__)
api = Api(app)

class TEST(Resource):

    def get(self, queue, subqueue):
        parser = reqparse.RequestParser()
        parser.add_argument('m', type=str, help='A message')
        args = parser.parse_args()

        TEST_queue = f'/{queue}/{subqueue}'
        message = args.get('m')

        return {'type': 'GET',
            'message': args.get('m'),
            'queue': TEST_queue}

    def post(self, queue, subqueue):
        TEST_queue = f'/{queue}/{subqueue}'

        # here is the problem
        # because of the incorrect header
        # the returned data is empty.

        message = request.data


        return {'type': 'POST',
           'message-length': len(message),
            'queue': TEST_queue}

api.add_resource(TEST, '/TEST/<string:queue>/<string:subqueue>')


if __name__ == '__main__':
    app.run(debug=DEBUG, host=TEST_PROXY, port=TEST_PROXY_PORT)

发送

POST http://localhost:1885/TEST/sub/sub2
Content-Type: application/json

{"status": {"current_time": "now"}}

有效。 request.data充满了内容

POST http://localhost:1885/TEST/sub/sub2
Content-Type: application/x-www-form-urlencoded

{"status": {"current_time": "now"}}

可以工作,但是requests.data现在为空,相反,数据已被解析并且不再以不变的形式可用。

由于发件人是封闭源,因此无法在短时间内解决该问题。

是否有一种方法可以为POST请求/此请求覆盖错误的内容类型,以便我可以访问原始的发布数据?

1 个答案:

答案 0 :(得分:0)

您可以使用request.get_data()代替request.data

来自docs

  

data以字符串形式包含传入的请求数据,以防Werkzeug不能处理。

  

get_data(cache=True, as_text=False, parse_form_data=False)这将从客户端读取缓冲的传入数据读取为一个字节串。默认情况下会缓存它,但是可以通过将cache设置为False来更改行为。

     

通常,在不首先检查内容长度的情况下调用此方法是一个坏主意,因为客户端可能会发送数十兆字节或更多的字节数,从而导致服务器出现内存问题。

但是最好检查request.content_type中的值并从request.jsonrequest.form获取数据。