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 ответов
здесь две стратегии пересечения истоков с учетом производительности.
они сводятся к:
- правильное использование
Access-Control-Max-Age
- пребывание в пределах "простого запроса"
использовать 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. Простое решение, однако, это не может быть приемлемым для всех.