繁体   English   中英

在 Heroku 上部署 Postgres Flask 应用程序,“gunicorn.errors.AppImportError:无法在 'app' 中找到属性 'app'。”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM