在Flask路线

时间:2017-08-30 11:10:00

标签: python flask flask-sqlalchemy

这是我到目前为止在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实例上注册,并且没有应用程序绑定到当前上下文

如何在我的所有烧瓶路线中访问查询集,以便我不必一直重复自己?

1 个答案:

答案 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)