web-dev-qa-db-ja.com

Flaskで応答ヘッダーを設定するにはどうすればよいですか?

これは私のコードです:

@app.route('/hello', methods=["POST"])
def hello():
    resp = make_response()
    resp.headers['Access-Control-Allow-Origin'] = '*'
    return resp

ただし、ブラウザからサーバーにリクエストを行うと、次のエラーが表示されます。

XMLHttpRequest cannot load http://localhost:5000/hello. 
No 'Access-Control-Allow-Origin' header is present on the requested resource.

また、リクエストの「後」に応答ヘッダーを設定して、このアプローチを試みました。

@app.after_request
def add_header(response):
    response.headers['Access-Control-Allow-Origin'] = '*'
    return response

サイコロなし。同じエラーが発生します。ルート関数に応答ヘッダーを設定する方法はありますか?このようなものが理想的です:

@app.route('/hello', methods=["POST"])
    def hello(response): # is this a thing??
        response.headers['Access-Control-Allow-Origin'] = '*'
        return response

とにかくこれを行うには見つけることができません。助けてください。

編集

POSTリクエストでURLをカールした場合:

curl -iX POST http://localhost:5000/hello

私はこの応答を受け取ります:

HTTP/1.0 500 INTERNAL SERVER ERROR
Content-Type: text/html
Content-Length: 291
Server: Werkzeug/0.9.6 Python/2.7.6
Date: Tue, 16 Sep 2014 03:58:42 GMT

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>500 Internal Server Error</title>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error and was unable to complete your request.  Either the server is overloaded or there is an error in the application.</p>

何か案は?

73
dopatraman

これはかなり簡単に行えます:

@app.route("/")
def home():
    resp = flask.Response("Foo bar baz")
    resp.headers['Access-Control-Allow-Origin'] = '*'
    return resp

flask.Response および flask.make_response() を見てください

ただし、after_requestも問題を正しく処理する必要があるため、何か別の問題があることがわかります。

編集
あなたはすでにmake_responseを使用していることに気づきました。これはその方法の1つです。前にも言ったように、after_requestも同様に機能するはずでした。 curlを使用してエンドポイントにアクセスして、ヘッダーが何であるかを確認してください。

curl -i http://127.0.0.1:5000/your/endpoint

君は見るべきだ

> curl -i 'http://127.0.0.1:5000/'
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 11
Access-Control-Allow-Origin: *
Server: Werkzeug/0.8.3 Python/2.7.5
Date: Tue, 16 Sep 2014 03:47:13 GMT

Access-Control-Allow-Originヘッダーに注目してください。

EDIT 2
私が疑ったように、あなたは500を得ているので、あなたが思ったようにヘッダーを設定していません。アプリを起動する前にapp.debug = Trueを追加して、もう一度お試しください。問題の根本原因を示す出力が得られるはずです。

例えば:

@app.route("/")
def home():
    resp = flask.Response("Foo bar baz")
    user.weapon = boomerang
    resp.headers['Access-Control-Allow-Origin'] = '*'
    return resp

適切にフォーマットされたhtmlエラーページを提供します。これは下部にあります(curlコマンドに役立ちます)。

Traceback (most recent call last):
...
  File "/private/tmp/min.py", line 8, in home
    user.weapon = boomerang
NameError: global name 'boomerang' is not defined
69
sberry

Flaskのようなmake_responseを使用します

@app.route("/")
def home():
    resp = make_response("hello") #here you could use make_response(render_template(...)) too
    resp.headers['Access-Control-Allow-Origin'] = '*'
    return resp

flask docs から

flask.make_response(* args)

ビューに追加のヘッダーを設定する必要がある場合があります。ビューは応答オブジェクトを返す必要はありませんが、Flask自体によって応答オブジェクトに変換される値を返すことができるため、ヘッダーを追加するのは困難になります。この関数は、リターンを使用する代わりに呼び出すことができ、ヘッダーを添付するために使用できる応答オブジェクトを取得します。

13
Devi

私のためのこの仕事

from flask import Flask
from flask import Response

app = Flask(__name__)

@app.route("/")
def home():
    resp = Response("")
    resp.headers['Access-Control-Allow-Origin'] = '*'
    return resp

if __== "__main__":
    app.run()
3
German Lopez