2017-12-29 7 views
2

Wie benutze AfterRequest Decorator, um eine Verbindung zu schließen, nachdem die Anfrage bearbeitet wurde? Ich verwende den before_request für die Verbindung für jede Anforderung api Öffnung wie folgt: Verwendung sqlalchemy Kern 1.0.8 und postgresql 9,5:Wie benutze AfterRequest in der Flask Datenbankverbindung und Python zu schließen?

#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() 

Probe API-Aufruf:

@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 

Die Ansichten sind Anrufe, die api geben nur eine Liste von Objekten zurück, hinzugefügt oder bearbeiten Objekt und eine Nachricht. Wie genau muss das Verbindungsobjekt an den After_request Decorator übergeben werden? Ich konnte der Dokumentation nicht wirklich folgen Exakter Code wird mir helfen.

+0

Die Verwendung von 'conn' in' categories_list 'wirft keinen Fehler? –

+0

@GarbageCollector gibt es eine before_request, ich habe es nicht benutzt in __init__.py – user956424

+0

Sie können [flask.g] (http://flask.pocoo.org/docs/0.12/api/#flask. g) um ein globales Datenbankverbindungsobjekt zu erzeugen. –

Antwort

2

Sie flask.g verwenden können, um beziehen sie ein globales db Verbindungsobjekt erstellen und verwenden überall

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 

Dann Verbindung in Ihren Routen wie diese

@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 

Dann endlich es so in die Nähe:

@app.after_request 
def after_request(response): 
    if g,db is not None: 
     print 'closing connection' 
     g.db.close() 
    return response 
Verwandte Themen