Как декодировать ответ колбы с пакетом сообщений?

62
6

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

from flask import Flask, Response, jsonify, make_response
import msgpack
import json
class FlaskResponse(Response):
@classmethod
def force_type(cls, rv, environ=None):
if isinstance(rv, dict):
rv = jsonify(rv)
msgData = super(FlaskResponse, cls).force_type(rv, environ)
print "msgData"
print msgpack.packb(json.loads(msgData.data))
return jsonify((msgpack.packb(json.loads(msgData.data))))

Я получаю ошибку

UnicodeDecodeError: 'utf8' codec can't decode byte 0x83 in position 0: invalid start byte

Любое предложение, что я здесь делаю неправильно?

спросил(а) 2021-01-27T23:37:10+03:00 2 месяца, 2 недели назад
1
Решение
61

Я думаю, проблема в том, что вы пытаетесь отправить упакованные байты в функцию jsonify, но Flask не работает с ней. Я могу порекомендовать установить данные в FlaskRequest после создания экземпляра.

from flask import Flask, Response, jsonify
import msgpack

class CustomResponse(Response):

@classmethod
def force_type(cls, response, environ=None):
# create response instance with empty data
flask_response = jsonify() # type: CustomResponse
if isinstance(response, dict):
# set some data to respose
flask_response.data = msgpack.packb(response)
# set content_type etc...
# flask_response.content_type = 'application/octet-stream'

print(flask_response.data)
# we return response object so we don't need super()
return flask_response

app = Flask(__name__)
app.response_class = CustomResponse

@app.route('/home')
def home():
return {
'example_dict': {
'container_name': 'test',
'id': 100,
},
}

Надеюсь это поможет.

ответил(а) 2021-01-27T23:37:10+03:00 2 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема