1. ホーム
  2. python

[解決済み] Flaskでレスポンスヘッダを設定するには?

2022-06-23 02:40:59

質問

これは私のコードです。

@app.route('/hello', methods=["POST"])
def hello():
    resp = make_response(render_template('hello.html'))
    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.

私はまた、リクエストの後にレスポンスヘッダを設定する、この方法を試しました"after"。

@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

というような感じなのですが、どうしたらいいのかわかりません。助けてください。

EDIT

のようにPOSTリクエストでurlをcurlすると。

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>

何かアイデアはありますか?

どのように解決するのですか?

かなり簡単にできますよ。

@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 も正しく処理されているはずだからです。

EDIT

今気づいたのですが、あなたはすでに 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