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?
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With