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?
Après avoir essayé d'autres suggestions et réponses. Voici ce que j'utilise, ce qui fonctionne.
Pas:
pip install flask flask-cors
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)
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.
Le flacon contient le module flask-cors . Voici l'extrait de code ainsi que la procédure.
pip install -U flask-cors
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
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
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)
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)
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.
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__)