Flask / Flask-restful: принудительно / корректно / переопределить неправильный заголовок типа содержимого для запросов POST - PullRequest
1 голос
/ 25 апреля 2019

У меня проблема с приложением с закрытым исходным кодом, которое отправляет неверный тип контента в шапке.

Я получаю данные как «content-type: application / x-www-form-urlencoded»

Я должен получить его как "content-type: application / json"

Ниже приведен код сервера фляги с использованием Flask и Flask-restful

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"}}

работает, но request.data теперь пуст, вместо этого данные были проанализированы и больше не доступны в неизмененном виде.

Так как отправитель является закрытым исходным кодом, решение проблемы на этой стороне невозможно в короткие сроки.

Есть ли способ переопределить неправильный тип содержимого для запросов POST / этого запроса, чтобы я мог получить доступ к исходным опубликованным данным?

1 Ответ

0 голосов
/ 25 апреля 2019

Вы можете использовать request.get_data() вместо request.data.

From docs :

data Содержит данные входящего запроса в виде строки, если они пришли с MIME-типом, который Werkzeug не обрабатывает.

и

get_data(cache=True, as_text=False, parse_form_data=False) Считывает буферизованные входящие данные от клиента в одну строку байтов.По умолчанию это кэшируется, но это поведение можно изменить, установив для кэша значение False.

Обычно не рекомендуется вызывать этот метод без предварительной проверки длины содержимого, поскольку клиент может отправить десятки мегабайт или более, чтобы вызватьпроблемы с памятью на сервере.

Но было бы лучше проверить значение в request.content_type и получить данные из request.json и request.form.

...