2017-08-30 131 views
0

这是我在views.py文件至今编写的代码:访问跨瓶路线相同的烧瓶SQLAlchemy的查询集

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对象)我创建了一个新的Flask实例分配给应用程序。对象db是从app.py(其目的在于生成数据并将其插入到数据库中)导入的。 app.py和db.py共享指定数据库URI的相同config.py文件。

正如你所看到的,我用Sites.query.all()重复了两次Flask路由。该代码目前正常工作返回所需的JSON响应。但是,当我尝试从一个函数/ Flask路径中将Sites.query.all()的赋值移到Flask路径的外部时,它会给出运行时错误:应用程序未在db实例上注册,且没有绑定到当前上下文的应用程序。

我怎样才能访问所有我的烧瓶路线的查询集,这样我就不必一直重复自己了?

+1

把'SQLALCHEMY'呼叫'__init __ py'和使用'db.init_app(APP)'有初始化。请参阅http://flask-sqlalchemy.pocoo.org/2.1/api/#configuration – 0decimal0

回答

0

如果你担心自己重复一个选项是此查询添加为网站模型象下面这样类方法:

@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)