Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Return a requests.Response object from Flask

I'm trying to build a simple proxy using Flask and requests. The code is as follows:

@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 

This works, except that it loses the status code from Elasticsearch. I tried returning resp (a requests.models.Response) directly, but this fails with

TypeError: 'Response' object is not callable 

Is there another, simple, way to return a requests.models.Response from Flask?

like image 201
Fred Foo Avatar asked Oct 24 '13 14:10

Fred Foo


People also ask

How do you get the request object in Flask?

To access the incoming data in Flask, you have to use the request object. The request object holds all incoming data from the request, which includes the mimetype, referrer, IP address, raw data, HTTP method, and headers, among other things.

How do you return a response in Python?

When one makes a request to a URI, it returns a response. This Response object in terms of python is returned by requests. method(), method being – get, post, put, etc.


1 Answers

Ok, found it:

If a tuple is returned the items in the tuple can provide extra information. Such tuples have to be in the form (response, status, headers). The status value will override the status code and headers can be a list or dictionary of additional header values.

(Flask docs.)

So

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

seems to do the trick.

like image 109
Fred Foo Avatar answered Sep 26 '22 03:09

Fred Foo