我希望你做得很好
我是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)
如果你需要更多的信息,请告诉我
提前感谢,, 西罗
导入app当然会给您循环导入,而不是直接使用Importing app,您可以通过从烧瓶中使用当前的应用程序来创建烧瓶上下文
相关问题 更多 >
编程相关推荐