Django跨域实现(CORS)

CORS - Cross-origin resoruce sharing

1.什么是CORS

允许浏览器跨源服务器,发出XMLHttpRequest请求,克服了AJAX只能同源使用的限制。

2.特点

  1. 浏览器自动完成(在请求头中输入特殊头 或 发送特殊请求)
  2. 服务需器需要支持(响应头中需要有特殊的字段)

3.简单请求(Simple requests) 和 预检请求(Preflighted requests)

满足以下全部条件的请求 为简单请求

  1. 请求方法: GET , HEAD , POST

  2. 请求头仅包含如下内容:

    Accept

    Accept-Language

    Content-Language

    Content-Type

  3. Content-Type 仅支持如下三种:

    application/-www-form-urlencoded

    multipart/form-data

    text/plain

不满足以上任意一点的请求都是预检请求

4.简单请求发送流程

  1. 请求头中 携带 Origin 表明自己来自哪个域

  2. 响应

    如果请求头中的Origin在服务器接受范围内,则返回如下头:

    响应头 作用 备注
    Access-Control-Allow-Origin 服务器接受的域 v
    Access-Control-Allow-Credentials 是否接受Cooike x
    Access-Control-Expose-Headers 认情况下,xhr只能拿到如下响应头:Cache-Control,Content-Language,Content-Type,Expires,Last-Modified;如果有需要获取其他头,需在此指定 x

    如果服务器不接受些域,则响应头中不包含Access-Control-Allow-Origin

5,预检请求发送流程

  1. OPTION请求发起,携带如下请求头:

    请求头 作用 备注
    Origin 表明来自哪 v
    Access-Control-Request-Method 主请求的方法 v
    Access-Control-Reqeust-Headers 此次请求使用的头 v
  2. OPTION响应头

    响应头 作用 备注
    Access-Control-Allow-Origin 同简单请求 v
    Access-Control-Allow-Methods 告诉浏览器,服务器接受的跨域请求方法 v
    Access-Control-Allow-Headers 返回所有支持的头部,当request有
    ‘Access-Control-Request-Headers’时,该响应头必然回复
    v
    Access-Control-Allow-Credentials 同简单请求 x
    Access-Control-Max-Age OPTION请求缓存时间,单位s x
  3. 主请求阶段

    请求头 作用 备注
    Origin 表明此请求来自哪个域
    响应头 作用 备注
    Access-Control-Allow-Origin 当前服务器接受得域

Django支持

django-cors-headers官网 https://pypi.org/project/django-cors-headers/

直接pip 将把django升级到2.0以上,强烈建议用离线安装方式

配置流程

        1,INSTALLED_APPS 中添加 corsheaders
		2,MIDDLEWARE 中添加 corsheaders.middleware.CorsMiddleware
		   位置尽量靠前,官方建议 ‘django.middleware.common.CommonMiddleware’ 上方
		3,CORS_ORIGIN_ALLOW_ALL  布尔值  如果为True 白名单不启用
		4,CORS_ORIGIN_WHITELIST =[
			"https://example.com"
		]
		5, CORS_ALLOW_METHODS = (
				'DELETE',
				'GET',
				'OPTIONS',
				'PATCH',
				'POST',
				'PUT',
				)
		6, CORS_ALLOW_HEADERS = (
				'accept-encoding',
				'authorization',
				'content-type',
				'dnt',
				'origin',
				'user-agent',
				'x-csrftoken',
				'x-requested-with',
			)
		7, CORS_PREFLIGHT_MAX_AGE  默认 86400s
		8, CORS_EXPOSE_HEADERS  []
		9, CORS_ALLOW_CREDENTIALS  布尔值, 默认False
发布了18 篇原创文章 · 获赞 0 · 访问量 521

猜你喜欢

转载自blog.csdn.net/luan_225/article/details/102780426