Gunicorn 在 Flask 应用程序的服务器挂钩中失败,并显示“应用程序对象必须可调用”,但前提是作为服务运行

Cai*_*ker 1 python service flask gunicorn raspberry-pi

我编写了一个 Flask 应用程序,它与 Gunicorn 一起提供服务并在 Raspberry Pi OS (Buster) 上运行。该应用程序应该在系统启动时作为服务自动运行。问题是,应用程序在作为服务运行时失败......但仅当作为服务运行时......

它曾经一直有效,直到我将服务器挂钩引入到我的 Gunicorn 配置文件中。其中有几个,但第一个被调用并因此失败的是:

Gunicorn.conf.py

def on_starting(server):
    import wsgi
    wsgi.on_starting(server)
Run Code Online (Sandbox Code Playgroud)

wsgi.py

def on_starting(server):
    api_instance = server.app.wsgi()
    shared_memory_manager = Manager()
    api_instance.requestless_variables = shared_memory_manager.dict()
    api_instance.log = server.log
    server.log.info("Loading API...")
Run Code Online (Sandbox Code Playgroud)

具有以下回溯

Traceback (most recent call last):
  File "/home/pi/.local/bin/gunicorn", line 8, in <module>
    sys.exit(run())
  File "/home/pi/.local/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 67, in run
    WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run()
  File "/home/pi/.local/lib/python3.8/site-packages/gunicorn/app/base.py", line 231, in run
    super().run()
  File "/home/pi/.local/lib/python3.8/site-packages/gunicorn/app/base.py", line 72, in run
    Arbiter(self).run()
  File "/home/pi/.local/lib/python3.8/site-packages/gunicorn/arbiter.py", line 198, in run
    self.start()
  File "/home/pi/.local/lib/python3.8/site-packages/gunicorn/arbiter.py", line 138, in start
    self.cfg.on_starting(self)
  File "/home/pi/nano/manager/src/api/gunicorn.conf.py", line 56, in on_starting
    api_instance = server.app.wsgi()
  File "/home/pi/.local/lib/python3.8/site-packages/gunicorn/app/base.py", line 67, in wsgi
    self.callable = self.load()
  File "/home/pi/.local/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 58, in load
    return self.load_wsgiapp()
  File "/home/pi/.local/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 48, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/home/pi/.local/lib/python3.8/site-packages/gunicorn/util.py", line 430, in import_app
    raise AppImportError("Application object must be callable.")
gunicorn.errors.AppImportError: Application object must be callable.
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,错误似乎与 相关api_instance = server.app.wsgi(),它出现在我的每个服务器挂钩中,同样也是我每个服务器挂钩中的故障点。

奇怪的事情是,如果直接从终端实例化,应用程序/Gunicorn 可以完美工作: 但如果从以下服务/home/pi/.local/bin/gunicorn -c /home/pi/nano/manager/src/api/gunicorn.conf.py --bind unix:nano_api.sock --umask 007 实例化,则会产生上述错误:

[Unit]
Description=Gunicorn instance serving the Nano API
After=network.target

[Service]
User=pi
Group=www-data
WorkingDirectory=/home/pi/nano/manager/src/api
ExecStart=/home/pi/.local/bin/gunicorn -c /home/pi/nano/manager/src/api/gunicorn.conf.py --bind unix:nano_api.sock --umask 007
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

任何人都对可能导致此问题的原因以及如何解决它有任何想法吗?非常感谢!

Cai*_*ker 7

嗯,经过10个小时的调试,我终于解决了问题......

我很惭愧地说这只是命名冲突。我有一个名为“api”的包,其中包含一个名为“api.py”的模块,该模块包含一个名为“api”的 Flask 实例,你猜对了。

由于我给这三个项目起了不同的名称并修复了我的引用,一切都进展顺利。

  • 根据这个[帖子](https://community.render.com/t/what-is-the- Correct-start-command-for-a-python-dash-app/5740/3),这对某人有用其他在 Heroku 上使用 Dash 应用程序并尝试迁移到“渲染”的人。引用&lt;&lt;我将名称从`app.py更改为my_app.py`,并使用启动命令gunicorn`my_app:server。`就可以了!:拥抱:&gt;&gt; (2认同)