【问题标题】:No application found on Flask function在 Flask 功能上找不到应用程序
【发布时间】:2022-01-19 16:28:18
【问题描述】:

我有两个文件,一个是数据库模型,另一个是主文件。 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)

【问题讨论】:

    标签: python flask sqlalchemy


    【解决方案1】:

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

    所以你必须这样称呼:

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

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

    self.app_context.pop()
    

    【讨论】:

    • 如果我添加上面的行并运行应用程序,应用程序会进入 create_adin_user 函数中的循环。我最终得到“遍历'expr'节点时超出了最大递归深度”
    • 也许你可以添加你如何调用init.py文件或者你想调用什么样的函数
    • 我现在只是从 cli 运行它,所以 python3 init.py。我正在尝试在 create_app 函数中运行 create_admin_user 函数。那就是它死去的地方。
    • 是的,这是正确的,因为在 create_app 内部它调用了 create_admin 函数,在内部又调用了 create_app
    【解决方案2】:

    搞定了。我在调用 create_admin 函数之前添加了 app.app_context().push(),现在它可以正常工作了。

    【讨论】:

      猜你喜欢
      • 2016-12-29
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多