Sanic (веб-сервер asyncio + uvloop) - возвращает пользовательский ответ

Я начинаю с Саника...

Sanic - это похожий на Flask веб-сервер Python 3.5+, созданный для быстрой работы. (...) Sanic поддерживает обработчики асинхронных запросов. Это означает, что вы можете использовать новый блестящий синтаксис async/await из Python 3.5, что делает ваш код неблокирующим и быстрым.

... и до этого момента есть очень мало примеров того, как его использовать, и документы не так хороши.

Следуя основному примеру документов, мы имеем

from sanic import Sanic
from sanic.response import json

app = Sanic()

@app.route("/")
async def test(request):
    return json({"test": True})

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=8000)

Например, как я могу вернуть пользовательский ответ с пользовательским кодом состояния?

2 ответа

Решение

В Sanic ответы HTTP являются экземплярами HTTPResponse, как вы можете видеть в приведенной ниже реализации кода и функций json, text а также html просто инкапсулировал создание объекта, следуя фабричному шаблону

from ujson import dumps as json_dumps
 ...    

def json(body, status=200, headers=None):
    return HTTPResponse(json_dumps(body), headers=headers, status=status,
    content_type="application/json")



def text(body, status=200, headers=None):
    return HTTPResponse(body, status=status, headers=headers,
                        content_type="text/plain; charset=utf-8")


def html(body, status=200, headers=None):
    return HTTPResponse(body, status=status, headers=headers,
                        content_type="text/html; charset=utf-8")

Функция json({"test": True}) просто сбрасывает dict объект в виде строки JSON, используя ультра быстрый UJSON и установить content_type пары.

Таким образом, вы можете вернуть пользовательский код состояния, возвращая json({"message": "bla"}, status=201) или создание HTTPResponse как приведенный выше код.

Пример из документации

from sanic import response

@app.route('/json')
def handle_request(request):
    return response.json(
        {'message': 'Hello world!'},
        headers={'X-Served-By': 'sanic'},
        status=200
    )
Другие вопросы по тегам