簡體   English   中英

Gunicorn 在 Flask 應用程序的服務器掛鈎中出現“應用程序 object 必須是可調用的”失敗,但前提是作為服務運行

[英]Gunicorn fails with "Application object must be callable" in server hook for Flask app, but only if run as service

我編寫了一個 Flask 應用程序,它與 Gunicorn 一起提供並在 Raspberry Pi OS (Buster) 上運行。 該應用程序應該在系統啟動時作為服務自動運行。 問題是,應用程序在作為服務運行時失敗......但只有在作為服務運行時......

在我將服務器掛鈎引入我的 Gunicorn 配置文件之前,它一直有效。 其中有幾個,但第一個被調用並因此失敗的是:

gunicorn.conf.py

def on_starting(server):
    import wsgi
    wsgi.on_starting(server)

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...")

使用以下回溯

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.

如您所見,錯誤似乎與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

任何人對可能導致此問題的原因以及如何解決它有任何想法? 非常感謝!

好吧,經過整整10個小時的調試,我終於找到了問題所在……

我很慚愧地說這只是一個命名沖突。 我有一個名為“api”的 package,其中包含一個名為“api.py”的模塊,其中包含一個名為“api”的 Flask 實例。

由於我給這三個項目起不同的名稱並修正了我的參考資料,所以一切都很順利。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM