2017-12-29 20 views
2

リクエストの処理後に接続を閉じるためにafter_requestデコレータを使用するにはどうすればよいですか?私は次のように各API要求のための接続を開くためbefore_requestを使用: SQLAlchemyのコア1.0.8とPostgreSQL 9.5を使用した:フラスコ内のafter_requestを使用してデータベース接続とPythonを閉じるにはどうすればいいですか?

#engine = create_engine(os.environ.get("DB_URL")) 
DB_URL="postgresql://mowner:[email protected]/mydb" 

@app.before_request 
def before_request(): 
    engine = create_engine(DB_URL, strategy='threadlocal') 
    conn = engine.connect() 


@app.after_request 
def after_request(conn): 
    if conn is not None: 
     print 'closing connection' 
     conn.close() 

サンプルAPI呼び出し:

@app.route('/api/v1.0/categories', methods=['GET']) 
def categories_list(): 
    ''' 
    Return categories list 
    ''' 
    if 'id' in session: 
     categories_list = [] 
     s = select([categories]) 
     rs = conn.execute(s) 
     if rs.rowcount > 0: 
      for r in rs: 
       categories_list.append(dict(r)) 
      rs.close() 
     # print 'this doesnt execute' 
     return jsonify({'categories list': categories_list}), 200 

    return jsonify({'message': "UNAUTHORIZED"}), 401 

ビューがどのAPIコールでありますオブジェクトのリストを返したり、オブジェクトやメッセージを編集したりするだけです。どのようにして接続オブジェクトをafter_requestデコレータに渡すのですか?私は実際に文書に従うことができませんでした 正確なコードは私を助けるでしょう。

+0

'categories_list'の内部で 'conn'を使用してもエラーは発生しませんか? –

+0

@GarbageCollector before_requestがありますが、これ以外には__init__.pyで使用しました – user956424

+0

[フルスコイル](http://flask.pocoo.org/docs/0.12/api/#flask)を使用できます。 g)グローバルデータベース接続オブジェクトを作成する。 –

答えて

2

あなたはグローバルDB接続オブジェクトを作成し、最終的にはこのようにそれを閉じて、この

@app.route('/api/v1.0/categories', methods=['GET']) 
def categories_list(): 
    ''' 
    Return categories list 
    ''' 
    if 'id' in session: 
     categories_list = [] 
     s = select([categories]) 
     rs = d.db.execute(s) 
     if rs.rowcount > 0: 
      for r in rs: 
      categories_list.append(dict(r)) 
     rs.close() 
     # print 'this doesnt execute' 
     return jsonify({'categories list': categories_list}), 200 
    return jsonify({'message': "UNAUTHORIZED"}), 401 

のようなあなたのルートで接続を使用して次にどこにでも

from flask import Flask, g 

#engine = create_engine(os.environ.get("DB_URL")) 
DB_URL="postgresql://mowner:[email protected]/mydb" 

@app.before_request 
def before_request(): 
    engine = create_engine(DB_URL, strategy='threadlocal') 
    conn = engine.connect() 
    g.db = conn 

それを使用して参照するためにflask.gを使用することができます。

@app.after_request 
def after_request(response): 
    if g,db is not None: 
     print 'closing connection' 
     g.db.close() 
    return response 
関連する問題