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