pythonproxyflaskpython-requests

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?


Solution

  • 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.content, resp.status_code, resp.headers.items()
    

    seems to do the trick.