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() 并且它现在工作正常。
我有两个文件,一个是数据库模型,另一个是主文件。 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() 并且它现在工作正常。