Flask 函数上找不到应用程序

No application found on Flask function

我有两个文件,一个是数据库模型,另一个是主文件。 creat_admin_user 函数不起作用。当我尝试 运行 init.py 时,我得到“找不到应用程序。要么在视图函数内部工作,要么推送应用程序上下文”。我查看了 SQLAlchemy 站点,我有 db.init_app 行并返回了应用程序对象。不知道我还缺少什么。错误似乎出现在 create_admin_user 函数第一行的用户查询上。

--------------- __init__.py ---------------
from .models import User, Note, db, DB_NAME
from flask import Flask

def create_app():
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{DB_NAME}'
    db.init_app(app)
    create_database(app)
    
    # create Admin user
    create_admin_user()

    return app
 
def create_database(app):
    if not path.exists('website/' + DB_NAME):
        db.create_all(app=app)
        print('Created Database!')
 
def create_admin_user():

    user = User.query.filter_by(username='admin').first()
    print("after query")

    if user:
        print("User already exists")
    else:
        # Add user to DB
        add_user = User(first_name='LocalAdmin', username='admin', password=generate_password_hash(gen_password,
                                                                                                   method='sha256'))
        # adds user and commits the db.session.add(add_user)
        db.session.commit()
        print(f"Admin user created successfully")
        
--------------- Models.py ---------------

import datetime
from flask_login import UserMixin
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.sql import func

db = SQLAlchemy()
DB_NAME = "database.db"


class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.String(100))
    last_name = db.Column(db.String(100))
    email = db.Column(db.String(100))
    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(100))
    domain = db.Column(db.String(100), nullable=False)
    creation_date = db.Column(db.DateTime, default=datetime.datetime.now())
    last_login = db.Column(db.DateTime, onupdate=datetime.datetime.now())
    failed_login = db.Column(db.Integer)
    active = db.Column(db.Integer, default=1)

如果您想 运行 在不启动 Flask 应用程序的情况下更改 Flask 应用程序的数据库的功能,您必须先推送应用程序上下文。

所以你必须这样调用:

self.app = create_app()
self.app_context = self.app.app_context()
self.app_context.push()

并且不要忘记删除上下文后缀。

self.app_context.pop()

成功了。我在调用 create_admin 函数之前添加了 app.app_context().push() 并且它现在工作正常。