这是我到目前为止在views.py文件中编写的代码:
from flask import Flask, jsonify
from app import db
from models import Sites
app = Flask(__name__)
app.config.from_pyfile('config.py')
db.init_app(app)
@app.route('/site-list')
def site_list():
site_table = Sites.query.all()
return jsonify({a.name: a.id for a in site_table})
@app.route('/site-geo')
def site_geo():
site_geo = Sites.query.all()
return jsonify({a.name: a.lat + ", " + a.long for a in site_geo})
if __name__ == "__main__":
app.run(debug=True, host='0.0.0.0', port=8080, passthrough_errors=True)
所以我相信通过使用db的init_app()方法(flask-sqlalchemy对象),我创建了一个分配给app的新Flask实例。对象db从app.py导入(其目的是生成数据并将其插入数据库)。 app.py和db.py共享相同的config.py文件,该文件指定数据库URI。
正如您所看到的,我在使用Sites.query.all()的两个Flask路线中重复了一遍。代码目前在返回所需的JSON响应时工作正常。但是,当我尝试将Sites.query.all()的赋值从函数/ Flask路径中移动到Flask路径之外时,它会产生运行时错误:应用程序未在db实例上注册,并且没有应用程序绑定到当前上下文
如何在我的所有烧瓶路线中访问查询集,以便我不必一直重复自己?
答案 0 :(得分:0)
如果您担心重复自己,可以选择将此查询添加为Sites模型的类方法,如下所示:
@classmethod
def get_all(cls):
sites_all = Sites.query.all()
return sites_all
然后在views.py中,您可以运行Sites.get_all(),您可以对此进行扩展以将参数传递给方法以执行格式化。
如果您担心两次查询数据库,那么您可以将查询集保存在会话内存中,然后在每个需要的路由中检索它,尽管我不知道这是否会带来优势。
保存:
session['sites_all'] = sites_all
要检索:
session.pop('sites_all', None)