これは私のコードです:
@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>
何か案は?
これはかなり簡単に行えます:
@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
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自体によって応答オブジェクトに変換される値を返すことができるため、ヘッダーを追加するのは困難になります。この関数は、リターンを使用する代わりに呼び出すことができ、ヘッダーを添付するために使用できる応答オブジェクトを取得します。
私のためのこの仕事
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()