2013-10-24 17 views
22

Ich versuche, einen einfachen Proxy mit Flask und Anfragen zu bauen. Der Code lautet wie folgt:Rückgabe eines Requests.Response Objekt aus Flask

@app.route('/es/<string:index>/<string:type>/<string:id>', 
      methods=['GET', 'POST', 'PUT']): 
def es(index, type, id): 
    elasticsearch = find_out_where_elasticsearch_lives() 
    # also handle some authentication 
    url = '%s%s%s%s' % (elasticsearch, index, type, id) 

    esreq = requests.Request(method=request.method, url=url, 
          headers=request.headers, data=request.data) 
    resp = requests.Session().send(esreq.prepare()) 
    return resp.text 

Dies funktioniert, außer dass es den Statuscode von Elasticsearch verliert. Ich habe versucht, direkt resp (a requests.models.Response) zurückkehrt, aber das scheitert mit

TypeError: 'Response' object is not callable 

Gibt es eine andere, einfach, Art und Weise ein requests.models.Response von Flask zurückzukehren?

Antwort

41

Ok, fand es:

Wenn ein Tupel die Elemente im Tupel zurückgegeben wird, zusätzliche Informationen zur Verfügung stellen kann. Solche Tupel müssen in der Form (Antwort, Status, Header) sein, wobei mindestens ein Element im Tupel sein muss. Der Statuswert überschreibt den Statuscode, und Header können eine Liste oder ein Verzeichnis zusätzlicher Headerwerte sein.

(Flask docs.)

So

return (resp.text, resp.status_code, resp.headers.items()) 

scheint den Trick zu tun.

+0

Legitime retter – lol

+0

Vielen Dank! Habe eine Stunde damit verbracht, das zu umgehen. –

+7

Verwenden Sie 'resp.content' anstelle von' resp.text', um sowohl binäre als auch Textantworten zu verarbeiten – iman

0

Ich lief in das gleiche Szenario, außer dass in meinem Fall meine Anfragen.models.Response einen Anhang enthielt. Dies ist, wie ich es an die Arbeit:

Rückkehr send_file (BytesIO (result.content), MIME-Typ = result.headers [ 'Content-Type'], as_attachment = True)

Verwandte Themen