Uvicorn не запускает sanic before_server_start

У меня есть такое приложение Sanic:



from functools import wraps
import os

from sanic import Sanic
from sanic.response import json

from es_api.client import ElasticEngine
from utils import cleanup

app = Sanic(__name__)

async def setup_es_client(app, loop):
    app.es_client = ElasticEngine.from_bonsai("xkcd_production", test_instance=False)



@app.route("/", methods=["GET"])
async def home(request):
    return json({"hello": "worldddd"})




@app.route("/all", methods=["GET"])
async def display_all_docs(request):
    results = app.es_client.search_all().results()
    return json(
        {"results": results}
    )



if __name__ == "__main__":
    app.register_listener(setup_es_client,
                          'before_server_start')
    app.run(host="0.0.0.0", port=8000, debug=True, workers=20)

Когда я запускаю uvicorn myapp, он отлично обслуживает домашнюю страницу: я вижу ожидаемый json.

Но когда я нажимаю /all, он говорит

"у приложения нет атрибута es_client"

, что предположительно указывает на то, что функция before_server_start не была запущена.

Как это исправить? Я просмотрел документ Sanic, но не нашел ссылок на эту проблему.

(Он отлично работает, когда я запускаю приложение как есть, т. Е. python3 myapp.py)


person nz_21    schedule 02.09.2019    source источник


Ответы (1)


Исправлено.

Переместить app.register_listener(setup_es_client, 'before_server_start') выше if __name__=="__main__"

А еще лучше, просто используйте встроенный декоратор sanic для лучшей эргономики: https://sanic.readthedocs.io/en/latest/sanic/middleware.html

person nz_21    schedule 02.09.2019