Uvicorn 不是 运行 sanic "before_server_start"

Uvicorn not running 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 时,它显示

"app has not attribute es_client"

,这大概表明 before_server_start 函数尚未 运行。

我该如何解决这个问题?我查看了 sanic 文档,但找不到任何关于此问题的参考资料

(当我按原样 运行 应用程序时它工作正常——即 python3 myapp.py

已修复。

app.register_listener(setup_es_client, 'before_server_start')移到if __name__=="__main__"

上方

更好的是,只需使用 sanic 的内置装饰器以获得更好的人体工程学:https://sanic.readthedocs.io/en/latest/sanic/middleware.html