2013-10-24 41 views
22

我試圖使用Flask和請求來構建一個簡單的代理。代碼如下:從Flask中返回一個requests.Response對象

@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 

這是有效的,只是它失去了Elasticsearch的狀態代碼。我試圖返回resp(一requests.models.Response)直接,但這種失敗

TypeError: 'Response' object is not callable 

有另一種,簡單的方法來從瓶返回requests.models.Response

回答

41

好吧,發現:

如果一個元組返回元組中的項目可以提供額外的信息。這些元組必須以表單(響應,狀態,頭部)的形式存在,其中至少有一個元素必須位於元組中。狀態值將覆蓋狀態碼,標題可以是附加標題值的列表或字典。

Flask docs

所以

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

似乎這樣的伎倆。

+0

合法救星 – lol

+0

謝謝!花了一個小時試圖解決這個問題。 –

+7

使用'resp.content'而不是'resp.text'來處理二進制和文本響應 – iman

0

我遇到了相同的情況,除了在我的情況下,我的requests.models.Response包含一個附件。這是我得到它的工作:

回報由send_file(BytesIO(result.content),MIME類型= result.headers [ '內容類型'],as_attachment = TRUE)