mod_wsgi: TypeError: ожидаемый объект байтовой строки для имени заголовка, найдено значение типа Unicode - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть веб-приложение для колб, работающее в Production с использованием Python 2.7.5 и mod_wsgi 3.4.Веб-приложение работает нормально в локальной и локальной петлях.

Недавно я добавил Flask Restplus API (3 метода).Все работает локально: мое веб-приложение работает нормально, 3 метода Api Rest отвечают корректно, и документы / swagger видны / работают по адресу /api/documentation.

Однако на рабочем сервере, использующем mod_wsgi, мое веб-приложение работает нормально, мой отдыхAPI работает, но если я получаю доступ к документам Swagger на http://mydomain/api/documentation,, я получаю две ошибки в журнале ошибок httpd:

Exception occurred processing WSGI script ...
TypeError: expected byte string object for header name, value of type unicode found

EDIT * в журнале доступа все запросы 200 ... только 500ошибка вызвана /api/swagger.json ... Есть даже 200 для / api / документации, что может быть причиной того, что заголовок и фавикон swagger загружаются на вкладку браузера, но под этим сообщением написано «Определение API не указано»

Сейчас я пытаюсь установить заголовки ответа следующим образом (с charset = UTF-8):

resp = app.response_class(
    response=json.dumps(found_resource),
    status=200,
    content_type='application/json; charset=UTF-8'
)
return resp

и

response = app.response_class(
    response=json.dumps({'success': False}),
    status=400,
    content_type='application/json; charset=UTF-8'
)
return response

Я задаю заголовокк объекту байтовой строки правильно для ответов?Любой ответ является либо словарем json, либо списком словарей json.

Я немного запутался, потому что из этого отчета об ошибках создается впечатление, что установка кодировки не является необходимой и, возможно, избыточной с использованием content_type= 'приложения / JSON;кодировка = UTF-8

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Хорошо, в моем случае ... исправление устанавливало response.headers с @ app.after_request Flask.

Очевидно, что mod_wsgi любит заголовки юникода, но HTTP ожидает байтовую строку.Вот решение ... Без него mod_wsgi не даст загрузиться swagger.json:

@app.after_request
def after(response):
    new_resp_headers = {}
    for k, v in response.headers.items():
        new_resp_headers[k.encode('ISO-8859-1')] = v.encode('ISO-8859-1')
    response.headers = new_resp_headers
    return response
0 голосов
/ 26 ноября 2018

Ответ должен быть реальным массивом байтов, а не строкой.Вы можете использовать

response = app.response_class(
    response=bytes(json.dumps(found_resource).encode('utf-8')),
    status=200,
    content_type='application/json; charset=UTF-8'
)
return response

Если вы когда-нибудь переключитесь на Python 3, вы можете использовать bytes(some_string, encoding='utf-8').

...