47

Flask とリクエストを使用して単純なプロキシを構築しようとしています。コードは次のとおりです。

@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(a ) を直接返そうとしrequests.models.Responseましたが、これは失敗します

TypeError: 'Response' object is not callable

requests.models.ResponseFlask からa を返す別の簡単な方法はありますか?

4

5 に答える 5

77

わかりました、それを見つけました:

タプルが返された場合、タプル内の項目は追加情報を提供できます。このようなタプルは、フォーム (応答、ステータス、ヘッダー) である必要があります。ステータス値はステータス コードをオーバーライドし、ヘッダーは追加のヘッダー値のリストまたは辞書にすることができます。

フラスコのドキュメント。)

そう

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

トリックを行うようです。

于 2013-10-24T14:43:09.510 に答える
0

私のユース ケースは、独自の Flask API で別の API を呼び出すことです。requests.getFlask 応答を介して失敗した呼び出しを伝播しているだけです。これが私の成功したアプローチです:

headers = {
    'Authorization': 'Bearer Muh Token'
}
try:
    response = requests.get(
        '{domain}/users/{id}'\
            .format(domain=USERS_API_URL, id=hit['id']),
        headers=headers)
    response.raise_for_status()
except HTTPError as err:
    logging.error(err)
    flask.abort(flask.Response(response=response.content, status=response.status_code, headers=response.headers.items()))
于 2020-02-17T23:04:37.957 に答える