1.什么是跨域?
跨域是因为浏览器的同源策略导致的,也就是说浏览器会阻止非同源的请求。那什么是非同源呢?既域名不同,端口不同,都属于非同源的。比如我们用vue写了个前端页面,端口为8081,Django写了个后台,端口为8000,前端往后台提交数据,后台返回数据会被浏览器拦截,因为端口不同。这就是跨域。
浏览器只阻止表单以及ajax请求,并不会阻止src请求。所以我们得CDN,图片等src都可以发送。
跨域请求分为两种,一种是简单请求,一种是复杂请求。
1.1 简单请求
HTTP方法是下列方法之一 :HEAD、GET、POST
HTTP头信息不超过以下几种字段:Accept,Accept-Language、Content-Language、
Last-Event-ID,application/x-www-from-urlencode,multpart/from-data,text/plain
1.2 复杂请求
任何一个不满足上述要求的情求,都认为是复杂请求,复杂请求会先发出一个预请求,
我们也叫预检,OPTIONS请求比如发送了一个post请求,
Content-Type为application/json,这就是复杂请求
2.解决跨域:
使用第三方库解决跨域的问题
2.1.安装第三方库django-cors-headers
pip3 install django-cors-headers
2.2.django-cors-headers是一个app,所以需要我们在settings.py里的app里注册 corsheaders,尽量放在前面
2.3.添加中间件,需要放在 'django.middleware.common.CommonMiddleware' 中间件之前
'corsheaders.middleware.CorsMiddleware'
2.4.添加白名单
CORS_ALLOW_CREDENTIALS = True # 允许跨域时携带Cookie,默认为False
CORS_ORIGIN_ALLOW_ALL = True # 所有ip都可以访问后端接口
# CORS_ORIGIN_WHITELIST = ["http://127.0.0.1:8080",["http://192.168.10.1:8080"] # 指定能够访问后端接口的ip或域名列表
# 允许访问的请求方法
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)
# 允许的headers
CORS_ALLOW_HEADERS = (
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
)
这样就可以解决跨域的问题