Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Django Rest框架/Angular JS飞行前选项请求_Javascript_Django_Angularjs_Django Rest Framework_Django Cors Headers - Fatal编程技术网

Javascript Django Rest框架/Angular JS飞行前选项请求

Javascript Django Rest框架/Angular JS飞行前选项请求,javascript,django,angularjs,django-rest-framework,django-cors-headers,Javascript,Django,Angularjs,Django Rest Framework,Django Cors Headers,我已经使用Django REST框架编写了一个API。对于身份验证,我使用django-oauth2-provider: 我在我的设置页面中配置了cors(使用Corsheaders中间件) 我的客户端应用程序是用Angular JS构建的。但是,每次我们发出任何请求(包括GET请求)时,都会发出一个选项请求。此选项请求需要约50-500毫秒,具体取决于请求 api调用看起来像“(2、3、4…等) 我需要弄清楚为什么会提出这个请求,以及如何提高应用程序的性能 使用CORS\u PREFLIGHT

我已经使用Django REST框架编写了一个API。对于身份验证,我使用django-oauth2-provider:

我在我的设置页面中配置了cors(使用Corsheaders中间件)

我的客户端应用程序是用Angular JS构建的。但是,每次我们发出任何请求(包括GET请求)时,都会发出一个选项请求。此选项请求需要约50-500毫秒,具体取决于请求

api调用看起来像“(2、3、4…等)


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

使用CORS\u PREFLIGHT\u MAX\u AGE设置来缓存响应:

CORS_飞行前_最大年龄:指定客户端/浏览器可以缓存飞行前响应的秒数

解释访问控制的最大年龄:

访问控制最大年龄(可选)-在上发出飞行前请求 每个请求都会变得昂贵,因为浏览器会发出两个请求 每个客户端请求的请求。此标头的值允许 要缓存指定秒数的飞行前响应


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

这是由发出请求的浏览器引起的。因为我同时控制服务器实例和客户机,所以在我的例子中,我能够将客户机上的请求头设置为“text/plain”,以满足CORS飞行前的需求。 然后,服务器端我修改了rest_框架源代码,基本上接受“text/plain”作为JSON媒体类型。 然而,简单的解决办法可能不是每个人都能接受的。

这里有一些建议

它们归结为:

  • 正确使用
    访问控制最大年龄
  • 停留在“简单请求”的范围内

  • 谢谢David,我以前看过CORS_PREFLIGHT_MAX_AGE,我试过了,但没用。而且默认值相当高。默认值:CORS_飞行前_MAX_AGE=86400简单请求的限制是什么意思?我是否将来自前端SPA(角度/反应/等)的所有请求转换为不进行CORS检查的简单请求。
    MIDDLEWARE_CLASSES = (
        ...
        'corsheaders.middleware.CorsMiddleware',
        'django.middleware.common.CommonMiddleware',
        ...
    )
    
    CORS_ORIGIN_ALLOW_ALL = True  # Dangerous (using for testing purposes)