如何使用Flask创建“utils.py”文件

2024-06-02 05:25:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望你做得很好

我是Flask的新手,我正在尝试使用这个框架和SQLite作为数据库来构建我的第一个网站。我也在使用应用程序工厂模式

我正在考虑创建一个utils文件,将重复代码放在其中,我需要在该文件中包含的一个非常简单的函数处理数据库

详情如下:

utils.py

def get_categories():
    tuple_list = []
    categories = Category.query.all()
    for category in categories:
        new_tuple = (category.id, category.name)
        tuple_list.append(new_tuple)
    return tuple_list

正如您所看到的,这个函数非常简单,它只是从数据库中获取类别,并以我想要的格式返回它们,一个元组列表

现在的问题是,当我使用python run.py运行服务器时,会出现以下错误:

RuntimeError: No application found. Either work inside a view function or push an application context. See http://flask-sqlalchemy.pocoo.org/contexts/.

我知道为什么会这样,需要一个应用程序上下文来对数据库执行操作。但是,我无法导入我的“app”对象,因为它会给我一个“循环导入错误”

如果我这样做:

def get_categories():
    tuple_list = []
    with app.app_context():
    categories = Category.query.all()
    for category in categories:
        new_tuple = (category.id, category.name)
        tuple_list.append(new_tuple)
return tuple_list

我明白了:

ImportError: cannot import name 'posts' from partially initialized module 'soyciro.posts.routes' (most likely due to a circular import) (C:\Users\Ciro\Documents\projects\python\soyciro\soyciro\posts\routes.py)

我的应用程序目录中有一个init.py文件,如下所示:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from soyciro.config import Config

from flask_bcrypt import Bcrypt
from flask_login import LoginManager

db = SQLAlchemy()
bcrypt = Bcrypt()
login_manager = LoginManager()
login_manager.login_view = 'users.login'
login_manager.login_message_category = 'info'


def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(Config)

    db.init_app(app)
    bcrypt.init_app(app)
    login_manager.init_app(app)

    from soyciro.main.routes import main
    from soyciro.posts.routes import posts
    from soyciro.work.routes import work
    from soyciro.users.routes import users
    from soyciro.categories.routes import categories
    app.register_blueprint(main)
    app.register_blueprint(posts)
    app.register_blueprint(work)
    app.register_blueprint(users)
    app.register_blueprint(categories)

    return app

我在应用程序的根目录中还有一个run.py文件,其中包含以下内容:

from myapp import create_app

app = create_app()

if __name__ == '__main__':
    app.run(debug=True)

如果你需要更多的信息,请告诉我

提前感谢,, 西罗


Tags: namefrompyimportregisterappflasklogin
1条回答
网友
1楼 · 发布于 2024-06-02 05:25:52

导入app当然会给您循环导入,而不是直接使用Importing app,您可以通过从烧瓶中使用当前的应用程序来创建烧瓶上下文

from flask import current_app as app


def get_categories():
    tuple_list = []
    with app.app_context():
        categories = Category.query.all()
        for category in categories:
            new_tuple = (category.id, category.name)
            tuple_list.append(new_tuple)
    return tuple_list

相关问题 更多 >