![](/img/trans.png)
[英]Problem with Procfile / wsgi when deploying to heroku with python flask app ~ Failed to find attribute
[英]Deploying Postgres Flask App on Heroku, "gunicorn.errors.AppImportError: Failed to find attribute 'app' in 'app'."
一天多来,我一直在尝试将我的 Flask 应用程序部署到 Heroku,观看/阅读几个教程,并深入研究我能找到的所有 stackoverflow 问题,但仍然没有找到解决我的问题的方法。 当我部署我的应用程序时,我收到错误“gunicorn.errors.AppImportError: Failed to find attribute 'app' in 'app'。” 我已经多次更改我的 Procfile 以让 heroku 运行我的应用程序,但我总是遇到同样的错误。
这就是我的应用程序的结构:在此处输入图像描述
我的 Procfile 包含以下语句:
web: gunicorn app:app --preload
我在想我的问题可能是我如何创建我的应用程序,但找不到解决方案。 我的主应用程序文件如下所示:
from venv import create
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from os.path import join, dirname, realpath
from flask_login import LoginManager
db = SQLAlchemy()
def create_app():
app = Flask(__name__, static_folder='static')
app.debug = True
app.config['SECRET_KEY'] = 'abcde12568901fghij'
#app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite3'
app.config['SQLALCHEMY_DATABASE_URI'] = '[removed for privacy]'
app.config['UPLOAD_DIRECTORY'] = join(dirname(realpath(__file__)), 'uploads/')
app.config['MAX_CONTENT_LENGTH'] = 16*1024*1024 #16mb
app.config['ALLOWED_EXTENSIONS'] = ['.jpg','.jpeg','.png','.gif','.mp4']
db.init_app(app)
login_manager = LoginManager()
login_manager.login_view = 'auth.login'
login_manager.init_app(app)
from models import User
@login_manager.user_loader
def load_user(user_id):
# since the user_id is just the primary key of our user table, use it in the query for the user
return User.query.get(int(user_id))
from auth import auth
app.register_blueprint(auth)
from views import main
app.register_blueprint(main)
return app
if __name__ == '__main__':
db.create_all(app=create_app())
完整日志的屏幕截图:在此处输入图像描述
任何帮助将不胜感激,谢谢大家!
app:app
告诉 Gunicorn 在您的app.py
文件(严格来说,在您的app
模块中)中查找名为app
的变量,但您没有具有该名称的变量。
相反,您有一个function create_app()
返回您的应用程序 object。 Gunicorn允许您直接使用它:
变量名也可以是 function 调用。 在这种情况下,将从模块中导入名称,然后调用以获取应用程序 object。 这通常被称为“应用程序工厂”模式。
相应地更新您的Procfile
:
web: gunicorn 'app:create_app()' --preload
您的根目录中是否有另一个文件正在创建应用程序,或者是您为运行应用程序而运行的文件上方的代码? 这通常只是一个带有项目名称的 Python 文件,这将具有类似app = create_app()
的内容。
然后您的Procfile
需要在该文件中查找应用程序。 例如,如果该文件名为mainApp.py
,那么您将使用
web: gunicorn mainApp:app --preload
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.