【问题标题】:Django Rest Framework/Angular JS Preflight options requestDjango Rest Framework/Angular JS Preflight 选项请求
【发布时间】:2014-10-03 15:24:53
【问题描述】:

我使用 Django REST 框架编写了一个 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)”

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

【问题讨论】:

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


    【解决方案1】:

    这里是Two Strategies for Crossing Origins with Performance in Mind

    他们归结为:

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

    【讨论】:

    • 简单请求的限制是什么意思?
    • 我是否将来自我的前端 SPA(Angular/React/etc) 的所有请求转换为不进行 CORS 检查的简单请求。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        使用 CORS_PREFLIGHT_MAX_AGE 设置缓存响应:

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

        This tutorial 解释 Access-Control-Max-Age

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

        【讨论】:

        • 谢谢大卫,我之前研究过 CORS_PREFLIGHT_MAX_AGE,我试过了,但没有用。默认值也很高。默认值:CORS_PREFLIGHT_MAX_AGE = 86400
        猜你喜欢
        • 2014-11-01
        • 1970-01-01
        • 2019-11-22
        • 2019-09-12
        • 2021-07-03
        • 2018-03-17
        • 1970-01-01
        • 2023-01-08
        • 2013-02-13
        相关资源
        最近更新 更多