簡體   English   中英

關於 Heroku 導入錯誤的 Flask 和 Gunicorn

[英]Flask and Gunicorn on Heroku import error

我有一個使用 MongoEngine 的小型 Flask 應用程序。

我的項目結構:

/myproject
  -application.py
  -config.py
  /my_app
    -models.py
    -views.py

我的應用程序.py:

#!/usr/bin/env python
from flask.ext.mongoengine import MongoEngine
from config import app
import os
app.debug = True

# get config settings
if __name__ == '__main__':
    app.config.from_object('config')
else:
    app.config.from_object('heroku_config')

# wrap app in mongengine
db = MongoEngine(app)

if __name__ == '__main__':
    # Bind to PORT if defined, otherwise default to 5000.
    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port)

我的模型.py:

from application import db
from flask import url_for

# declare model classes
...

我正在 Heroku 上部署。 如果我的 Procfile 顯示:

 web: python application.py

它工作正常。 當我嘗試切換到 Gunicorn 時:

 web: gunicorn application:app  

當我啟動 gunicorn 時,它通過導入錯誤的方式抱怨:

ImportError: cannot import name db

為什么現在會出現這個問題? 我猜這是一個路徑問題,但我不明白為什么會這樣。

我假設您正在 application.py 中注冊藍圖或類似的東西,然后導入模型,對嗎?
您沒有提供視圖文件或您如何使用視圖文件,如果我的猜測不正確,我下面的答案也不會正確。

如果我的猜測是正確的,那可能是因為循環導入。 您可以創建一個包含這些行的 db.py 文件(從 application.py 移動):

from flask.ext.mongoengine import MongoEngine
db = MongoEngine(app)

然后將該文件導入您的模型( from db import db )。
這意味着流程看起來像這樣: db -> model -> view -> app而不是app (db) -> model -> view -> app

循環導入會產生各種煩人的問題,請盡可能避免它們。

如果您使用的是init風格的燒瓶模塊,那么以下工作(源自托盤燒瓶教程 v Flask 2.0.1)。 https://www.palletsprojects.com/p/flask/

web: env FLASK_APP=flaskr gunicorn -b '0.0.0.0':${PORT} 'flaskr:create_app()'

其中 create_app 是從 flaskr/ init .py 調用的“應用程序”

暫無
暫無

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

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