Django中解决跨域问题

同源策略(Same origin policy)是一种约定,它规定了 请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同,如果不一致,请求会发送成功,后端会正常响应,但是浏览器会拦截

跨域问题产生的原因:

浏览器对非同源请求返回的结果做了拦截,只要做前后端分离,就会产生跨域问题

解决跨域问题

CORS:跨域资源共享 ,向相应头中加数据,允许跨域

JSONP:利用有的标签没有跨域问题 比如script img

websocket:长连接,不存在跨域

前端代理:开发阶段用,上线不用

CORS如何解决跨域问题

首先我们需要服务端支持----》就是服务端在相应头中加数据

CORS基本流程

CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)

简单请求:只发送一次

非简单请求:发送两次,第一次是OPTIONS请求,第二次是真正的请求

什么是简单请求,什么是非简单请求

只要同时满足以下两大条件,就属于简单请求。

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

凡是不同时满足上面两个条件,就属于非简单请求。

解决跨域问题

方案一

统一写一个中间件,处理所有跨域

from django.utils.deprecation import MiddlewareMixin
class CorsMiddleWare(MiddlewareMixin):
    def process_response(self,request,response):
        if request.method=="OPTIONS":
            #可以加*
            response["Access-Control-Allow-Headers"]="*"
            res['Access-Control-Allow-Methods'] = '*'
        response["Access-Control-Allow-Origin"] = "*"
        return response

方案二

使用第三方模块

	# 1、使用pip安装
	pip install django-cors-headers
    #2、添加到setting的app中
    INSTALLED_APPS = (
        ...
        'corsheaders',
        ...
    )
  #3、添加中间件
    MIDDLEWARE = [  
        ...
        'corsheaders.middleware.CorsMiddleware',
        ...
    ]
4、setting下面添加下面的配置
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'
)

你可能感兴趣的:(python,django)