请求跨域问题
跨域
不同的域,ip+端口:
http://127.0.0.1:8001/
http://162.0.0.1:8001/
http://127.0.0.1:8002/
同源策略:
浏览器的安全策略,请求发出去了,也正常响应了,但是被浏览器拦截了 处理这个问题:跨域问题 -CORS(跨域资源共享)后端的技术
CORS两种
--
请求分类
什么是简单请求 (1) 请求方法是以下三种方法之一: HEAD GET POST (2)HTTP的头信息不超出以下几种字段: Accept Accept-Language Content-Language Last-Event-ID Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
简单请求:
满足简单请求的条件,发一次请求;
def test(request): import json obj=HttpResponse(json.dumps({'name':'lqz'})) # obj['Access-Control-Allow-Origin']='*' obj['Access-Control-Allow-Origin']='http://127.0.0.1:8004' return obj
非简单请求:
不满足简单请求条件,发两次请求,一次是OPTIONS预检请求,一次是真正的请求;
#数据格式不符合简单请求 <button id="btn">点我发请求</button> <script> $("#btn").click(function () { $.ajax({ url:'http://127.0.0.1:8000/v1/publishs/', type:'get', {#type:'delete',#} {#type:'put',#} contentType:'application/json', data:JSON.stringify({'name':'lqz'}), success:function (data) { console.log(data) } }) }) </script>
中间件配置简单/非简单请求
from django.utils.deprecation import MiddlewareMixin class CORSMiddle(MiddlewareMixin): def process_response(self,request,response): # 简单请求 response['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8001' # 非简单请求, if request.method == 'OPTIONS': # 如果是put和delete方法,重新再发一次请求 response['Access-Control-Allow-Methods'] = 'PUT,DELETE' response['Access-Control-Allow-Headers']='Content-Type' return response mid.py
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', #配置到中间件 'app01.mid.CORSMiddle', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
设置跨域请求白名单
安装
pip install django-cors-headers
添加应用
在settings里面配置 INSTALLED_APPS = ( ... 'corsheaders', ... )
中间层设置
MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', ... ]
添加白名单
# CORS CORS_ORIGIN_WHITELIST = ( '127.0.0.1:8080', 'localhost:8080', #凡是出现在白名单中的域名,都可以访问后端接口 ) CORS_ALLOW_CREDENTIALS = True # 指明在跨域访问中,后端是否支持对cookie的操作

浙公网安备 33010602011771号