Django Rest Framework / Angular JS Preflight选项请求

时间:2014-08-10 19:54:51

标签: javascript django angularjs django-rest-framework django-cors-headers

我使用Django REST Framework编写了一个API。对于身份验证,我使用的是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 ms,具体取决于请求。

api调用看起来像" https://example.com/api/v1/posts/?page=1(2,3,4 ......等)"

我需要了解为什么要提出这个请求,以及如何提高应用程序的性能。

4 个答案:

答案 0 :(得分:1)

使用 CORS_PREFLIGHT_MAX_AGE 设置缓存回复:

  

CORS_PREFLIGHT_MAX_AGE:指定客户端/浏览器可以缓存预检响应的秒数

This tutorial解释了 Access-Control-Max-Age

  

Access-Control-Max-Age(可选) - 发出预检请求   每个请求变得昂贵,因为浏览器正在制作两个   请求每个客户端请求。此标头的值允许   预检响应将被缓存指定的秒数。

答案 1 :(得分:1)

这是Two Strategies for Crossing Origins with Performance in Mind

他们归结为:

  1. 正确使用Access-Control-Max-Age
  2. 保持在“简单请求”的范围内

答案 2 :(得分:0)

当您的服务器请求预检请求时,您的服务器应该通过使用正确的标头回复来允许该请求 服务器shoud发回请求 设置为Access-Control-Allow-Origin的{​​{1}}将解决您的问题。

答案 3 :(得分:0)

这是由发出请求的浏览器引起的。因为我控制服务器实例和客户端,在我的情况下,我能够将客户端上的请求标头设置为“text / plain”,它负责CORS预检要求。 然后,服务器端我修改了我的rest_framework源,基本上接受“text / plain”作为JSON媒体类型。 然而,简单的解决方法可能并不适合所有人。