7

我使用 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 毫秒,具体取决于请求。

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

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

4

4 回答 4

1

使用CORS_PREFLIGHT_MAX_AGE设置缓存响应:

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

本教程解释了Access-Control-Max-Age

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

于 2014-08-12T12:09:07.610 回答
1

这里有两种跨越起源的策略,并考虑到性能

它们归结为:

  1. 正确使用Access-Control-Max-Age
  2. 停留在“简单请求”的范围内
于 2016-01-14T16:58:38.667 回答
0

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

于 2015-02-24T17:57:35.950 回答
0

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

于 2015-07-21T22:48:36.300 回答