函数装饰器导致“运行时错误:未找到应用程序”

问题描述

我有几个函数,例如“generate_groups2()”,它用数据填充数据库表,并具有相同的代码部分,用于聚合当前函数的所有项目并将它们提交到数据库。我试图为常见操作制作装饰器“提交者”,并考虑到 DRY,并将其应用于“generate_groups1()”。 但当时有些东西坏了,我有

运行时错误:未找到应用程序。在视图函数中工作或推送应用程序上下文。

import functools
from models import db,GroupModel


def commiter(func):
    @functools.wraps(func)
    def wrapper(*args,**kwargs):
        return [item for item in func(*args,**kwargs)]
    print(wrapper())
    db.session.add_all(wrapper())
    db.session.commit()


@commiter
def generate_groups1():
    names = ["a","b","c"]
    for name in names:
        yield GroupModel(name=name)


def generate_groups2():
    names = ["a","c"]
    for name in names:
        db.session.add(GroupModel(name=name))
        db.session.commit()

这是“models.py”:

from flask_sqlalchemy import sqlAlchemy

db = sqlAlchemy()


class GroupModel(db.Model):
    __tablename__ = "groups"
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(5),unique=True)

    def __init__(self,name):
        self.name = name

    def __repr__(self):
        return f"<Group {self.name}>"

“main.py”在下面:

from flask import Flask
from flask_migrate import Migrate

from generate import generate_groups1,generate_groups2
from models import db

app = Flask(__name__)
app.config['sqlALCHEMY_DATABASE_URI'] = "postgresql://postgres:pass@localhost:5432/univ_db"
app.config['sqlALCHEMY_TRACK_MODIFICATIONS'] = False

db.init_app(app)
migrate = Migrate(app,db)


@app.before_first_request
def db_initialize():
    with app.app_context():
        db.create_all()
        generate_groups1()
        generate_groups2()


@app.route('/')
def index():
    return 'data added'


if __name__ == '__main__':
    app.run(debug=True,use_reloader=False)
Traceback (most recent call last):
  File "C:\Users\Alex\PycharmProjects\task-10-sql\venv\lib\site-packages\sqlalchemy\util\_collections.py",line 1008,in __call__
    return self.registry[key]
KeyError: <greenlet.greenlet object at 0x00000285F38A9720 (otid=0x00000285F38ADE80) current active started main>

During handling of the above exception,another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Alex\PycharmProjects\task-10-sql\main.py",line 4,in <module>
    from generate import generate_groups1,generate_groups2
  File "C:\Users\Alex\PycharmProjects\task-10-sql\generate.py",line 15,in <module>
    def generate_groups1():
  File "C:\Users\Alex\PycharmProjects\task-10-sql\generate.py",line 10,in commiter
    db.session.add_all(wrapper())
  File "<string>",line 2,in add_all
  File "C:\Users\Alex\PycharmProjects\task-10-sql\venv\lib\site-packages\sqlalchemy\orm\scoping.py",line 23,in _proxied
    return self.registry()
  File "C:\Users\Alex\PycharmProjects\task-10-sql\venv\lib\site-packages\sqlalchemy\util\_collections.py",line 1010,in __call__
    return self.registry.setdefault(key,self.createfunc())
  File "C:\Users\Alex\PycharmProjects\task-10-sql\venv\lib\site-packages\sqlalchemy\orm\session.py",line 4101,in __call__
    return self.class_(**local_kw)
  File "C:\Users\Alex\PycharmProjects\task-10-sql\venv\lib\site-packages\flask_sqlalchemy\__init__.py",line 174,in __init__
    self.app = app = db.get_app()
  File "C:\Users\Alex\PycharmProjects\task-10-sql\venv\lib\site-packages\flask_sqlalchemy\__init__.py",line 1042,in get_app
    raise RuntimeError(
RuntimeError: No application found. Either work inside a view function or push an application context. See http://flask-sqlalchemy.pocoo.org/contexts/.

Process finished with exit code 1

无法找出使用装饰器与不使用装饰器的情况之间的区别。它如何影响功能与应用程序的关系?有什么想法吗?

解决。 “提交者”应如下所示:

def commiter(func):
    @functools.wraps(func)
    def wrapper(*args,**kwargs):
        items = [item for item in func(*args,**kwargs)]
        db.session.add_all(items)
        db.session.commit()
    return wrapper

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)