跨域问题
1 跨域问题介绍
# 跨域问题出现的原因? PC端,前后端分离,才会出现
-浏览器:同源策略,浏览器的基本安全策略,不允许 去不同的url地址获取数据;域名,端口,协议必须相同
# 解决方案:CORS
CORS,后端技术,跨域资源共享,服务端在响应头中加入一下东西,允许跨域。
CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)
简单请求只发一次,非简单请求发送两次,第一次是OPTIONS预检请求,第二次是真正的请求。
# 简单请求要满足以下2个条件
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
#
2 跨域问题解决
# 解决思路:
1.简单请求,支持跨域
服务器设置响应头:Access-Control-Allow-Origin = '域名' 或 '*'
2.非简单请求支持跨域
在响应头中设置:Access-Control-Allow-Methods='*'
在响应头中设置:Access-Control-Request-Headers='*'
# 解决方案1:自定义中间件
class CorsMiddle(MiddlewareMixin):
def process_response(self, request, response):
if request.method == 'OPTIONS':
response['Access-Control-Allow-Headers'] = '*'
response['Access-Control-Allow-Methods'] = '*'
# 在响应头中加入Access-Control-Allow-Origin,处理了简单请求
response['Access-Control-Allow-Origin'] = '*'
# 处理非简单请求
return response
# 解决方案2:使用第三方模块 (推荐)
1安装
pip install django-cors-headers
2 在app中注册
INSTALLED_APPS = (
...
'corsheaders',
...
)
3 在中间件中加入
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
...
]
4 在配置文件中配置
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
'Pragma',
'token'
)