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?
Using
text
orcontent
property of theResponse
object will not work if the server returns encoded data (such ascontent-encoding: gzip
) and you return the headers unchanged. This happens becausetext
andcontent
have been decoded, so there will be a mismatch between the header-reported encoding and the actual encoding.According to the documentation:
and
So, the following works for gzipped data too:
If you use a shortcut method such as
get
, it's just:Ok, found it:
(Flask docs.)
So
seems to do the trick.
I ran into the same scenario, except that in my case my requests.models.Response contained an attachment. This is how I got it to work: