跨域访问POST请求需预先发送option请求问题处理方案python
By:授客 QQ:103355122django
实践环境json
Win 10后端
Python 3.5.4跨域
Django-2.0.13.tar.gz浏览器
官方下载地址:缓存
https://www.djangoproject.com/download/2.0.13/tarball/服务器
问题描述app
使用POST请求访问Django后端API时自动先发送option请求,而后才执行POST请求post
缘由分析
跨域资源共享(CORS)机制致使。
浏览器将CORS请求分红两类:简单请求(simple request)和非简单请求(not-so-simple request)。
只要同时知足如下两大条件,就属于简单请求,不然就是非简单请求。
一、请求方法是如下三种方法之一:
HEAD
GET
POST
二、HTTP的头信息不超出如下几种字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type(其值只限于application/x-www-form-urlencoded、multipart/form-data、text/plain)
当请求存在跨域资源共享(CORS),而且是非简单请求,就会触发CORS的预检请求(preflight);"预检"请求用的请求方法是OPTIONS,若是请求OK,才会再次发送目标操做请求。
实际开发过程当中,后台采用token检验机制,前台发送请求必须将token放到Request Header中,那么就须要传输自定义Header信息、或则请求头中的Content-Type设置为"application/json",就会造成非简单请求。 可是不少时候,咱们并不但愿浏览器这么作,重复的请求,一方面是增长服务器压力,另外一方面,至关于增长了请求响应时间。
解决方法
一种比较合适的解决方法就是增长响应头“Access-Control-Max-Age”来控制浏览器在多长时间内(单位为秒)无需在请求时发送预检请求,从而减小没必要要的预检请求。
中间件代码以下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = '授客'
from django.utils.deprecation import MiddlewareMixin
class PublicAccessControlMiddleware(MiddlewareMixin):
def process_request(self, request):
pass
def process_response(self, request, response):
response['Access-Control-Max-Age'] = 86400 #3600*24h = 86400秒,即告诉浏览器,缓存预检结果24小时,即针对同一URL请求,发送第一个OPTION请求日后24小时内再也不发送OPTION请求。
return response
参考连接