同源策略(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
凡是不同时满足上面两个条件,就属于非简单请求。
解决跨域问题
方案一
统一写一个中间件,处理所有跨域文章来源:https://www.toymoban.com/news/detail-815333.html
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
方案二
使用第三方模块文章来源地址https://www.toymoban.com/news/detail-815333.html
# 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'
)
到了这里,关于Django中解决跨域问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!