django+redis前后端分离项目

1. 跨域

跨域:出于浏览器的同源策略限制,协议(protocol),主机(host)和端口号(port)有任一不同时,就会出现跨域问题
跨域请求分类(简单请求,复杂请求):
  简单请求(同时满足以下三个条件)
    1. 请求方式必须为get,head,post
    2. 请求头仅包含:accept,accept-language,content-language,content-type
    3. content-type仅支持以下三种:application/x-www-form-urlencoded,multipart/form-data,text/plain
  复杂请求:
    不是简单请求的请求

简单请求的流程:
  简单请求的请求头中会自带origin,表名自己来自于哪个域
  响应会带有access-control-allow-origin的响应头,表名后端接收的域
复杂请求(预检请求)的流程:
  1. 先发一个options请求,携带origin,access-control-request-method,access-control-request-headers请求头
  2. 服务器处理请求,返回access-control-allow-origin,
access-control-request-method,access-control-request-headers响应头
  3. 浏览器再次发送真实请求
  备注:预检请求会发送两次请求,会增大服务器的压力,所以在options预检请求的时候,服务器会返回一个access-control-max-age的响应头,
    返回一个有效时间(一般一天),浏览器在有效期期间再次请求时不必再发options请求,直接发送真实请求即可。

解决方法
1. jsonp
只能发送get请求,不使用
2. cors
跨域资源共享
3. nginx反向代理


2. django的cors解决跨域

1. installed_app中添加corsheaders
2. middleware中添加'corsheaders.middleware.CorsMiddleware'
    位置尽量靠前,官方建议放在'django.middleware.common.CommonMiddleware'之前
3. CORS_ORIGIN_ALLOW_ALL值为True时,白名单不启用,所有域名均可访问
4. CORS_ORIGIN_WHITELIST 白名单启用,是个列表或元组
5. CORS_ALLOW_METHODS 允许的请求方式
6. CORS_PREFLIGHT_MAX_AGE 在多少时间内,不用预检请求,默认86400s,即一天
CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
    'VIEW',
)

CORS_ALLOW_HEADERS = (
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
)
原文地址:https://www.cnblogs.com/JackShi/p/15057136.html