运行python脚本时出现gunicorn错误

时间:2020-10-17 15:39:56

标签: python gunicorn aiohttp

这是我的python代码。

    from aiohttp import web

    if __name__ == "__main__":
        app = web.Application()
        cors = aiohttp_cors.setup(app)

        app.on_shutdown.append(on_shutdown)
        app.router.add_get("/", index)
        app.router.add_get("/client.js", javascript)

        cors = aiohttp_cors.setup(app, defaults={
            "*": aiohttp_cors.ResourceOptions(
                    allow_credentials=True,
                    expose_headers="*",
                    allow_headers="*",
                )
        })
        resource = cors.add(app.router.add_resource("/offer"))
        cors.add(resource.add_route("POST", offer))

        resource = cors.add(app.router.add_resource("/image_makeup"))
        cors.add(resource.add_route("POST", image_makeup))
        
        web.run_app(
            app, access_log=None, host=args.host, port=args.port, ssl_context=ssl_context
        )

命令:

gunicorn main:app --bind localhost:8080 --worker-class aiohttp.GunicornWebWorker

错误:

    [2020-10-17 21:17:13 +0530] [47676] [INFO] Starting gunicorn 20.0.4
    [2020-10-17 21:17:13 +0530] [47676] [INFO] Listening at: http://127.0.0.1:8080 (47676)
    [2020-10-17 21:17:13 +0530] [47676] [INFO] Using worker: sync
    [2020-10-17 21:17:13 +0530] [47678] [INFO] Booting worker with pid: 47678
    usage: gunicorn [-h] [--cert-file CERT_FILE] [--key-file KEY_FILE] [--host HOST] [--port PORT] [--verbose]
    gunicorn: error: unrecognized arguments: --bind localhost:8080 wsgi:main
    [2020-10-17 21:17:18 +0530] [47678] [INFO] Worker exiting (pid: 47678)
    [2020-10-17 21:17:19 +0530] [47680] [INFO] Booting worker with pid: 47680

我的根目录中仍然有main.py仍然出现上述错误。 请看看我在哪里弄错了。

2 个答案:

答案 0 :(得分:0)

由于您没有直接运行文件“ main.py”,因此变量__name__的值不是__main__而是main。您需要更改您的if语句:

if __name__ == "main":
    app = web.Application()
    ...

答案 1 :(得分:0)

按照in the documentation给出的

运行Gunicorn时,请提供模块名称(在main中使用)和应用程序或应用程序工厂的名称,以及作为命令行标志或配置文件提供的其他Gunicorn设置。

入口点可以是应用程序实例,也可以是不接受任何参数并返回应用程序实例的协程。

您的代码必须类似于:

from aiohttp import web

async def my_web_app():
    app = web.Application()
    ....
    return app

from aiohttp import web

my_web_app = web.Application()
....

Gunicorn命令变为:

gunicorn main:my_web_app --bind localhost:8080 --worker-class aiohttp.GunicornWebWorker