web-dev-qa-db-fra.com

Flacon Python Cors Edition

Je suis un peu novice en Python, mais le même problème a été rencontré avec les applications Node. Je fais une jolie requête jQuery AJAX à mon serveur local 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);
        }

Je peux confirmer que le jeton de variable confirme comme ceci:

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

Mais je reçois cette erreur de ma console 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.

J'ai constaté que lorsque je construis des applications de nœud que c'est une erreur cors. La page sur laquelle j’exécute la requête jQuery AJAX est http. Voici les parties de mon code Python que je pense configurer incorrectement:

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'

Et la route:

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

    return 'something'

Mon erreur Python renvoie également une erreur, car la demande ne parvient jamais à cette ligne de code:

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

Je peux réparer ça plus tard. Quoi qu'il en soit, quelqu'un a-t-il des suggestions concernant les configurations Cors pour Python?

11
Max Baldwin

Après avoir essayé d'autres suggestions et réponses. Voici ce que j'utilise, ce qui fonctionne.

Pas:

  1. pip install flask flask-cors

  2. Copier et coller ceci dans le fichier app.py

Code

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 __== "__main__":
  app.run(Host='0.0.0.0', port=8000, debug=True)
  1. python app.py

Remarque: assurez-vous que la configuration ajax de votre client contient les éléments suivants:

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

Si on se le demande, support_credentials=True signifie simplement qu’il envoie des cookies le long de la charge utile dans les deux sens.

11
Alan Dong

Le flacon contient le module flask-cors . Voici l'extrait de code ainsi que la procédure.

  1. pip install -U flask-cors

  2. Ajoutez ces lignes dans votre application de flacon:

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

Voir plus en cliquant sur ce lien

3
user7176771

utilisez le décorateur après le décorateur.

voici un extrait de la documentation ...

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

maintenant, il semble que vous utilisiez json; si c'est le cas, vous devriez probablement lire la documentation, car elle mentionne spécifiquement ce cas d'utilisation, et ce que cors_headers doit définir ... c'est en dessous du pli, mais cette documentation est bien écrite et facile comprendre.

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

3
Derek

Voici comment vous salir les mains en manipulant vous-même le détail 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)
2
lyfing

Veuillez utiliser @cross_Origin (origine = '*') dans votre fichier python

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 __== "__main__":
  app.run(Host='0.0.0.0', port=8000, debug=True)
0
Manivannan Murugavel

La solution ci-dessous a fonctionné pour moi. J'ai inclus une méthode qui ajoute les en-têtes nécessaires pour vous, puis déclenche la réponse HTTP. Ex:

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)

Remarque: La méthode ci-dessus n’est pas une compilation python, vous devrez donc peut-être la modifier.

0
Shasti

Essaye ça:

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

J'ai essayé le didacticiel @cross_Origin sur le site Web de Flask, mais cela n'a pas fonctionné pour moi.

Mais il semble que vous puissiez ajouter des en-têtes à votre réponse ultérieurement.

Voici mon code restant qui, à mon avis, pourrait être utile.

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

app = Flask(__name__)
0
GyuHyeon Choi