AJAX Запросить ошибку политики CORS с Flask - PullRequest
0 голосов
/ 06 февраля 2020

Я использую Flask для создания простого бэк-офиса. Я пытаюсь сделать некоторые запросы на стороне клиента, используя AJAX, но он всегда выдает мне следующую ошибку:

доступ к XMLHttpRequest в 'http://10.11.0.123/ ... 'from origin' http://localhost: 5000 'заблокировано политикой CORS: Ответ на предпечатный запрос не проходит проверку контроля доступа: нет заголовка «Access-Control-Allow-Origin» присутствует на запрошенном ресурсе.

Я уже пробовал несколько решений, но ни одно из них не сработало. Я также использую пакет CORS из flask_cors следующим образом:

    CORS(app, resources={r"/hardware/control/1": {"origins": "http://localhost:5000"}})
    app.run(host="0.0.0.0", port=5000, threaded=True)

Однако я думаю, что это не влияет на запросы AJAX, поскольку приложение Flask запускается на стороне сервера. Итак, вот мой ajax запрос:

$.ajax({
            url: 'http://10.11.0.123/...',
            type: "GET",
            contentType: 'text/plain',
            headers: {
                'Access-Control-Allow-Origin': '*',
            },
            withCredentials: true,
            crossDomain: true,
            success: function (result) {
                console.log(result)
            },
        });

Я знаю, что сервер назначения получает запрос, однако я не могу получить ответ от сервера.

Анализ сети запросы, с консоли chrome, запрос возвращает статус: сбой и введите: xhr.

Моя конечная точка в flask:

@system.route('/hardware/control/<int:device_id>')
def hardware_control(device_id):
    device = Device.query.get(device_id)
    return render_template('hardware_interaction/camera_preview.html',device=device)

Я создаю приложение следующим образом :

def create_app():
     app = Flask(__name__, instance_relative_config=False)
     app.config.from_object('config.DevelopmentConfig')
     CORS(app, resources={r"/hardware/control/*": {"origins": "*"}})
     with app.app_context():
        return app

app = create_app()

if __name__ == "__main__":
     app.run(host="0.0.0.0", port=5000, threaded=True)

Ответы [ 3 ]

0 голосов
/ 06 февраля 2020

Вы можете использовать это, чтобы проверить, что это действительно проблема CORS. Это сработало для меня.

@app.after_request
def after_request(response):
    header = response.headers
    header['Access-Control-Allow-Origin'] = '*'
    header['Access-Control-Allow-Headers'] = 'Content-Type, Authorization'
    header['Access-Control-Allow-Methods'] = 'OPTIONS, HEAD, GET, POST, DELETE, PUT'
    return response
0 голосов
/ 07 февраля 2020

Спасибо всем за помощь. Я уже решил проблему. Я делал запросы к HTTP PTZ-камере, которые не позволяют мне делать запросы со стороны клиента (я понятия не имею, почему). Итак, я взломал проблему, и теперь я делаю запросы на свой сервер, а мой сервер делает запрос на камеру. Вот что я делаю:

$.ajax({url: 'http://127.0.0.1:5000/teste00',
        type: "GET",
        success: function (result) {},
        });

На стороне сервера:

@system.route('/teste00')
def teste():
    response = requests.get('camera_url')
   return response.content
0 голосов
/ 06 февраля 2020

Заголовок Access-Control-Allow-Origin должен быть возвращен из Flask, не запрашивается AJAX. Так было бы что-то вроде этого:

def get_content():
    return "It works!", 200

@app.route('/')
def home():
    content, status_code = get_content()
    headers = {'Access-Control-Allow-Origin': '*'}
    return content, status_code, headers
...