Проблема с короной Python
Я отчасти новичок в 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 также возвращает ошибку, потому что запрос никогда не попадает в эту строку кода:
def validate_request(object_from_user):
load_object = json.loads(object_from_user)
Я могу это исправить позже. В любом случае, есть ли у кого-нибудь предложения по настройке Cors для Python?
Ответы
Ответ 1
После того, как я попробовал другие предложения и ответы. Вот что я использую, что работает.
Шаги:
код
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)
-
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 по полезной нагрузке вперед и назад.
Ответ 2
Колба имеет модуль колба-корс. Ниже приведен фрагмент кода и процедура.
-
pip install -U flask-cors
-
Добавьте эти строки в ваше приложение фляги:
from flask import Flask
from flask_cors import CORS, cross_origin
app = Flask(__name__)
CORS(app)
@app.route("/")
def helloWorld():
return "Hello world"
Смотрите больше, нажав на эту ссылку
Ответ 3
Вот, как получить свою руку грязно, полностью обрабатывая деталь 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)
Ответ 4
используйте декоратор 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
Ответ 5
Пожалуйста, используйте @cross_origin (origin = '*') в вашем файле 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 __name__ == "__main__":
app.run(host='0.0.0.0', port=8000, debug=True)
Ответ 6
Решение ниже работало для меня.
Я включил метод, который добавит нужные вам заголовки, а затем поднимет 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, поэтому вам, возможно, придется его отредактировать.
Ответ 7
Попробуйте следующее:
@app.after_request
def add_headers(response):
response.headers.add('Access-Control-Allow-Origin', '*')
response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
Я пробовал учебник @cross_origin на веб-сайте Flask, однако для меня это не сработало.
Но похоже, что вы можете добавить заголовки в свой ответ позже.
Вот мой оставшийся код, который, я думаю, может быть полезен.
from flask import Flask, request
from sklearn.externals import joblib
app = Flask(__name__)
Ответ 8
нам нужно импортировать CORS в .py файл из flask_cors; импортировать CORS, cross_origin CORS (app, support_credentials = True)
Ответ 9
Основанный на ответе 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
Ответ 10
На стороне клиента вам нужно только убедиться, что данные вашего сервера имеют дело. Например, данные формы или 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)