2017-08-30 7 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) 

だから私はそのデシベルのinit_app()メソッドを使用して(と信じてフラスコ - sqlalchemyオブジェクト)私は、アプリケーションに割り当てられた新しいFlaskインスタンスを作成しました。オブジェクトdbは、app.py(データを生成してデータベースに挿入する目的)からインポートされます。 app.pyとdb.pyはデータベースURIを指定するのと同じconfig.pyファイルを共有します。

ご覧のとおり、Sites.query.all()を使用して2つのFlaskルート内で自分自身を繰り返しました。このコードは現在、目的のJSONレスポンスを返すうえで問題なく動作します。しかし、関数/ FlaskルートからFlaskルートの外にSites.query.all()の割り当てを移動しようとすると、ランタイムエラーが発生します。アプリケーションはdbインスタンスに登録されておらず、アプリケーションは現在のコンテキストにバインドされていません。

私はすべてのフラスコ経路を通ってクエリーセットにアクセスすることができるので、自分自身を繰り返し続ける必要はありませんか?

+1

をpy' __init __ ''でSQLALCHEMY'コールを入れて、 ''そこdb.init_app(アプリ)を使用して初期化します。保存するには

。 http://flask-sqlalchemy.pocoo.org/2.1/api/#configurationを参照してください。 – 0decimal0

答えて

0

使用すると、1つのオプションを自分で繰り返しを心配している場合は、以下のようなサイトのモデルのためのクラスメソッドとしてこのクエリを追加することです。)

@classmethod 
def get_all(cls): 
    sites_all = Sites.query.all() 
    return sites_all 

そして、あなたのviews.pyにあなたがSites.get_allを(実行することができますこれを拡張して、メソッドにパラメータを渡して書式設定を実行することもできます。

データベースを2回クエリすることを心配している場合は、セッションメモリにクエリセットを保存してから、必要な各ルートでクエリセットを取得できますが、これが利点をもたらすかどうかはわかりません。

session['sites_all'] = sites_all 

を取得するには:

session.pop('sites_all', None) 
関連する問題