web-dev-qa-db-ja.com

Python Flask Corsの問題

私は一種のPythonを初めて使用しますが、Nodeアプリを使用して同じ問題を抱えています。かなり標準的なjQuery AJAX Pythonサーバー:

init: function(callback) {
            var token = _config.get_token();

            $.ajax({
                    url: 'http://localhost:5000/api/ia/v1/user_likes',
                    type: 'POST',
                    contentType: 'application/json',
                    datatype: 'json',
                    data: token
                })
                .done(function(data) {
                    callback(data);
                })
                .fail(function(err) {
                    callback(err);
                });

            callback(token);
        }

変数トークンが次のように確認されていることを確認できます。

Object {access_token: "791415154.2c0a5f7.4d707361de394512a29682f9cb2d2846", campaign_id: "102"}

しかし、私は私のJavaScriptコンソールからこのエラーを受け取っています:

XMLHttpRequest cannot load http://localhost:5000/api/ia/v1/user_likes. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://s3.amazonaws.com' is therefore not allowed access. The response had HTTP status code 500.

Nodeアプリを構築しているとき、これはcorsエラーであることがわかりました。jQueryを実行しているページAJAXからのリクエストはhttpです。ここにあります。私のPythonコードの一部ですが、私が間違って構成していると思います:

from flask import Flask, request, redirect
from flask.ext.cors import CORS, cross_Origin

app = Flask(__name__)
cors = CORS(app)
app.config['CORS_HEADERS'] = 'application/json'

そしてルート:

@app.route("/api/ia/v1/user_likes", methods=['POST', 'OPTIONS'])
def user_likes():
    validate = validate_request(request.data)

    return 'something'

My Python errorもエラーを返します。これは、リクエストが次のコード行に到達しないためです。

def validate_request(object_from_user):
    load_object = json.loads(object_from_user)

後で修正できます。とにかく、PythonのCors構成について何か提案はありますか?

16
Max Baldwin

私が他の人の提案と答えを試した後。これが私が使うもので、うまくいきます。

手順:

  1. pip install flask flask-cors

  2. これをコピーしてapp.pyファイルに貼り付けます

コード

from flask import Flask, jsonify
from flask_cors import CORS, cross_Origin

app = Flask(__name__)
CORS(app, support_credentials=True)

@app.route("/login")
@cross_Origin(supports_credentials=True)
def login():
  return jsonify({'success': 'ok'})

if __name__ == "__main__":
  app.run(Host='0.0.0.0', port=8000, debug=True)
  1. python app.py

注:クライアントのajax構成に以下が含まれていることを確認してください。

$.ajaxSetup({
    type: "POST",
    data: {},
    dataType: 'json',
    xhrFields: {
       withCredentials: true
    },
    crossDomain: true,
    contentType: 'application/json; charset=utf-8'
});

不思議に思うかもしれませんが、support_credentials=Trueは、ペイロードに沿ってCookieを送受信することを意味します。

16
Alan Dong

Flaskには flask-cors モジュールがあります。以下は、コードスニペットと手順です。

  1. pip install -U flask-cors

  2. flaskアプリケーションに次の行を追加します。

    from flask import Flask
    from flask_cors import CORS, cross_Origin
    
    app = Flask(__name__)
    CORS(app)
    
    @app.route("/")
    def helloWorld():
        return "Hello world"
    

このリンク をクリックして詳細をご覧ください

7
user7176771

CORSの詳細をすべて自分で処理して、手を汚す方法を次に示します。

handle_result = {'result': True, 'msg': 'success'}

try:
    # Origin, where does this request come from, like www.Amazon.com
    Origin = flask.request.environ['HTTP_Origin']
except KeyError:
    Origin = None

# only accept CORS request from Amazon.com
if Origin and Origin.find('.Amazon.com') > -1:
    resp = flask.make_response(str(handle_result))
    resp.headers['Content-Type'] = 'application/json'

    h = resp.headers
    # prepare headers for CORS authentication
    h['Access-Control-Allow-Origin'] = Origin
    h['Access-Control-Allow-Methods'] = 'GET'
    h['Access-Control-Allow-Headers'] = 'X-Requested-With'

    resp.headers = h
    return resp

return flask.abort(403)
5
lyfing

ルートデコレータの後にcorsデコレータを使用します。

ここにドキュメントのスニペットがあります...

@app.route("/")
@cross_Origin() # allow all origins all methods.
def helloWorld():
  return "Hello, cross-Origin-world!"

今、あなたはjsonを使用しているようです、それがケースである場合、このユースケースと具体的に設定するcors_headersに言及しているので、おそらくドキュメントを読むべきです...それは隠し場所の下にありますが、このドキュメントはよく書かれていて簡単です理解する。

http://flask-cors.readthedocs.org/en/latest/#using-json-with-cors

3
Derek

pythonファイルで@cross_Origin(origin = '*')を使用してください

from flask import Flask, jsonify
from flask_cors import CORS, cross_Origin

app = Flask(__name__)

@app.route("/login", methods = ['GET'])
@cross_Origin(origin='*')
def login():
  return jsonify({'success': 'ok'})

if __name__ == "__main__":
  app.run(Host='0.0.0.0', port=8000, debug=True)

GyuHyeon Choiの応答に基づいていますが、return responseを追加し、さらにAccess-Control-Expose-Headersを追加するとうまくいきました。

@app.after_request
def add_headers(response):
    response.headers.add('Content-Type', 'application/json')
    response.headers.add('Access-Control-Allow-Origin', '*')
    response.headers.add('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS')
    response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
    response.headers.add('Access-Control-Expose-Headers', 'Content-Type,Content-Length,Authorization,X-Pagination')
    return response
0
Dorian

クライアント側では、サーバーが処理しているデータの種類を確認するだけで済みます。たとえば、フォームデータまたはjson。

注:cross_Originの配置は正しいはずです。

私のために以下に書かれたコードは魔法をかけました

from flask import Flask,request,jsonify
from flask_cors import CORS,cross_Origin
app=Flask(__name__)
CORS(app, support_credentials=True)
@app.route('/api/test', methods=['POST', 'GET','OPTIONS'])
@cross_Origin(supports_credentials=True)
def index():
    if(request.method=='POST'):
     some_json=request.get_json()
     return jsonify({"key":some_json})
    else:
        return jsonify({"GET":"GET"})


if __name__=="__main__":
    app.run(Host='0.0.0.0', port=5000)
0
Dila Gurung

以下の解決策が私にとってうまくいきました。必要なヘッダーを追加してHTTP応答を発生させるメソッドを含めました。例:

def some_method(response_data, status_code):
    response_data = //here you can manipulate the data, JSONify, convert arrays into objects or vice versa
    headers = {
        "Content-Type": "application/json",
        "Access-Control-Allow-Origin": '*',
        "Access-Control-Allow-Methods": 'PUT, GET, POST, DELETE, OPTIONS',
        "Access-Control-Allow-Headers": 'Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token'
        }
    //THEN RAISE HTTPResponse
    raise HTTPResponse(status, headers, body)

注:上記の方法はpythonコンパイルではないため、編集する必要がある場合があります。

0
Shasti

これを試して:

@app.after_request
def add_headers(response):
    response.headers.add('Access-Control-Allow-Origin', '*')
    response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')

Flask Webサイトで@cross_Originチュートリアルを試しましたが、うまくいきませんでした。

しかし、後でヘッダーを応答に追加できるようです。

これが、便利だと思う私の残りのコードです。

from flask import Flask, request
from sklearn.externals import joblib

app = Flask(__name__)
0
GyuHyeon Choi

flask次のコマンドを使用して、次のような宣言を使用してインストールしました:

pips3.6 install --userフラスコ-cors

  from flask_cors import CORS   
    app = Flask(__name__)
    CORS(app)
0
naik899