Ошибки CORS с Flask и gevent

У меня есть работающий API, использующий Flask, Flask-SQLAlchemy и Flask-Restless, и я пытаюсь выполнять запросы POST/PUT/DELETE из javascript (точнее, backbone.js). Тем не менее, я продолжаю сталкиваться с ошибками CORS - все, кроме GET, возвращает в браузере ошибку HTTP OPTIONS 501 Not Implemented Error.

Сначала я попытался добавить наименее ограничительные заголовки CORS ко всем ответам:

@app.after_request
def after(response):
    response.headers.add('Access-Control-Allow-Origin', '*')
    response.headers.add('Access-Control-Allow-Methods',
                         'POST, GET, PUT, PATCH, DELETE, OPTIONS')
    response.headers.add('Access-Control-Allow-Headers',
                         'Content-Type, X-Requested-With')
    response.headers.add('Access-Control-Max-Age', '1728000')

    return response

CORS, похоже, дал сбой, когда для заголовка Content-Type запроса было установлено значение application/json (как того требует API), поэтому был сделан быстрый взлом, чтобы все заработало:

@app.before_request
def before():
    request.environ['CONTENT_TYPE'] = 'application/json'

Однако все, кроме POST, по-прежнему не работает. Кроме того, ведение журнала gevent включено, но никакие запросы OPTIONS никогда не регистрируются (что, как я полагаю, является предварительной проверкой CORS), даже когда браузер показывает их сбой с ошибкой 501.

Нужно ли что-то менять в gevent или Flask, чтобы CORS работал?

Редактировать: Запуск API с использованием встроенного сервера Flask работает, поэтому здесь проблема с gevent, но я не могу найти много документации...


person John Brodie    schedule 01.12.2012    source источник


Ответы (2)


Существует фрагмент фляги Декоратор для контроля доступа HTTP, вы можете использовать декоратор @crossdomain(origin='*') .

person clsung    schedule 11.12.2012
comment
Ваша ссылка не работает. - person Noah Broyles; 14.07.2020

Самый простой способ — использовать плагин flask-cors.

Установить с помощью пипа

pip install -U колба-корс

Образец кода

app = Flask(__name__)
cors = CORS(app, resources={r"/api/*": {"origins": "*"}})

@app.route("/api/v1/users")
def list_users():
  return "user example"

Документацию можно найти здесь документация flask-cors.

person Ahmed Shabib    schedule 27.08.2016