2015-01-14 7 views
6

Ich möchte in der Lage sein, auf das Anfrageobjekt zuzugreifen, bevor ich die Antwort des HTTP-Aufrufs zurückgebe. Ich möchte Zugriff auf die Anfrage über „teardown_request“ und „after_request“:Flask - Zugriff auf die Anfrage in after_request oder teardown_request

from flask import Flask 
... 
app = Flask(__name__, instance_relative_config=True) 
... 

@app.before_request 
def before_request(): 
    # do something 

@app.after_request 
def after_request(response): 
    # get the request object somehow 
    do_something_based_on_the_request_endpoint(request) 

@app.teardown_request 
def teardown_request(response): 
    # get the request object somehow 
    do_something_based_on_the_request_endpoint(request) 

ich sah, dass ich die Anfrage an g hinzufügen und etwas tun, wie folgt aus:

g.curr_request = request 

@app.after_request 
def after_request(response): 
    # get the request object somehow 
    do_something_based_on_the_request_endpoint(g.curr_request) 

Aber die oben scheint ein bisschen seltsam. Ich bin mir sicher, dass es eine bessere Möglichkeit gibt, auf die Anfrage zuzugreifen.

Dank

+0

Können Sie Ihre Frage ein wenig klären, indem Sie: 1) die relevanten Import-Anweisungen hinzufügen 2) Was meinen Sie mit "Ich möchte über" teardown_request "und" after_request ":" – joostdevries

+0

@joostdevries - Ich habe die Frage bearbeitet. Ich möchte einige Operationen basierend auf der ursprünglichen Anfrage ausführen, bevor ich die Antwort sende (in meinem Fall muss ich einige Dinge im Zusammenhang mit den db-Transaktionen basierend auf der Anfrage-URL behandeln ...), aber ich bin mir nicht sicher, wie ich darauf zugreifen soll Anfrage in "after_request" und "teardown_request" – Lin

+0

Was ist los mit der Verwendung von g, um einen Verweis auf die Anfrage zu behalten, oder vielleicht besser, nur die URL oder der relevante Teil der URL? Angesichts des hier empfohlenen Verhaltens, das Gegenteil von dem zu tun, was Sie wollen (ändern Sie die Antwort in der before_request() -Methode), scheint die Verwendung von g eine einfache und vernünftige Lösung zu sein: http://flask.pocoo.org/docs/0.10/patterns/deferredcallbacks/ – bsa

Antwort

9

Die Lösung ist einfach -

from flask import request 

@app.after_request 
def after_request(response): 
    do_something_based_on_the_request_endpoint(request) 
+0

Ist das threadsicher? – EpicDavi

+0

Ja. Es verwendet lokalen Thread-Speicher. –