Django Rest Framework / угловой запрос параметров предполетного JS

Я написал API, используя Django Rest Framework. Для аутентификации я использую django-OAuth2-provider:https://github.com/caffeinehit/django-oauth2-provider

У меня есть cors, настроенный на моей странице настроек так (используя промежуточное ПО Corsheaders.)

MIDDLEWARE_CLASSES = (
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
)

CORS_ORIGIN_ALLOW_ALL = True  # Dangerous (using for testing purposes)

мое клиентское приложение построено с помощью Angular JS. Однако каждый раз, когда мы делаем какой-либо запрос (включая запросы GET), отправляется запрос опций. Этот запрос параметров занимает ~50 - 500 МС в зависимости от запроса.

вызовы api выглядят как"https://example.com/api/v1/posts/?page=1 (2, 3, 4...и т. д.)"

Мне нужно обернуть голову вокруг того, почему этот запрос делается, и как улучшить производительность для приложения.

4 ответов


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

они сводятся к:

  1. правильное использование Access-Control-Max-Age
  2. пребывание в пределах "простого запроса"

использовать CORS_PREFLIGHT_MAX_AGE настройка кэширования ответов:

CORS_PREFLIGHT_MAX_AGE: укажите количество секунд, в течение которых клиент / браузер может кэшировать предполетный ответ

в этом уроке объясняются Access-Control-Max-Age:

управление доступом-Макс-возраст (опционный) - делать запрос preflight дальше каждый запрос становится дорогим, так как браузер сделав два запросов для каждого запроса клиента. Значение этого заголовка позволяет ответ перед полетом должен быть кэширован в течение заданного количества секунд.


когда ваш запрос сервера preflight запрос ваш сервер должен разрешить этот запрос, ответив с соответствующими заголовками сервер shoud отправил запрос с Access-Control-Allow-Origin значение Content-Type решит вашу проблему.


Это вызвано браузером, из которого сделан запрос. Поскольку я контролирую как экземпляр сервера, так и клиент, в моем случае я смог установить заголовки запросов на клиенте в "text/plain", который заботится о требовании предварительной подготовки CORS. Затем на стороне сервера я изменил источник rest_framework, чтобы в основном принять "text / plain" как тип носителя JSON. Простое решение, однако, это не может быть приемлемым для всех.