Django前后端分离跨域请求问题
一、问题背景
之前使用django+vue进行前后端分离碰到跨域请求问题,跨域(域名或者端口不同)请求问题的本质是由于浏览器的同源策略导致的,当请求的响应不是处于同一个域名和端口下,浏览器不会接受响应,同源策略也是浏览器针对请求的安全问题所作出的一种保护行为。针对跨域问题,可以有下面的解决方式:
- JSONP方式
- 自定义中间件,设置响应头
- 使用django-cors-headers包
二、解决方式
(一)自定义中间件
JSONP本质上是利用html的一些不受同源策略影响的标签属性src,例如:<a>、<img>、<script>等标签的src属性,从而实现跨域请求,但是这种方法只支持GET的请求方式,这里暂不做过多讨论,主要说自定义中间件以及利用django-cors-headers包来实现跨域。
1、自定义中间件
class MiddlewareMixin(object):
def __init__(self, get_response=None):
self.get_response = get_response
super(MiddlewareMixin, self).__init__() def __call__(self, request):
response = None
if hasattr(self, 'process_request'):
response = self.process_request(request)
if not response:
response = self.get_response(request)
if hasattr(self, 'process_response'):
response = self.process_response(request, response)
return response class CORSMiddleware(MiddlewareMixin): def process_response(self,request,response):
# 添加响应头
# 允许相应的域名来访问,多个域名中间以逗号隔开,如果全部可使用'*'
response['Access-Control-Allow-Origin'] = "*"
# 允许携带的请求头,多个中间以逗号隔开
response['Access-Control-Allow-Headers'] = "Content-Type"
# 允许发送的请求方式
response['Access-Control-Allow-Methods'] = "DELETE,PUT"
return response
2、注册中间件(在settings文件中注册)
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
...
...
'crm.utils.cors.CORSMiddleware' #跨域中间件
]
(二)CORS(Cross-Origin Resource Sharing)
1、安装django-cors-headers包
pip install django-cors-headers #在对应的开发环境中安装
2、修改settings文件
- 注册应用
# Application definition INSTALLED_APPS = [
'django.contrib.admin',
...'django.contrib.staticfiles',
'corsheaders',#放在新建应用之前
'rest_framework',
...'crm'
]
- 中间件注册
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware', # 注意顺序,放在此处
'django.middleware.common.CommonMiddleware',
...
]
- 其它设置
CORS_ORIGIN_ALLOW_ALL = True #允许所有的请求,或者设置CORS_ORIGIN_WHITELIST,二选一
CORS_ALLOW_HEADERS = ('*') #允许所有的请求头
CORS_ALLOW_CREDENTIALS = True # 允许携带cookie,前端需要携带cookies访问后端时,需要设置withCredentials: true
这样就可以进行跨域使用了。
但是大多数站点将需要利用Django提供的跨站点请求伪造保护。CORS和CSRF是分开的,并且Django无法使用您的CORS配置免除网站Referer对安全请求所做的检查。做到这一点的方法是使用其CSRF_TRUSTED_ORIGINS设置。
3、CSRF整合
#1、CSRF_TRUSTED_ORIGINS 设置
CORS_ORIGIN_WHITELIST = [
' http://read.only.com ',
' http://change.allowed.com ',
] #不需要CORS_ORIGIN_ALLOW_ALL=True的设置 CSRF_TRUSTED_ORIGINS = [
' change.allowed.com ',
] #2、中间件设置
#启用此功能在django.middleware.csrf.CsrfViewMiddleware后,还应添加#corsheaders.middleware.CorsPostCsrfMiddleware
MIDDLEWARE_CLASSES = [
...
' corsheaders.middleware.CorsMiddleware ',
...
' django.middleware.csrf.CsrfViewMiddleware ',
'corsheaders.middleware.CorsPostCsrfMiddleware ',
...
]
详情参考官方文档:https://github.com/adamchainz/django-cors-headers
Django前后端分离跨域请求问题的更多相关文章
- 关于.Net Core 前后端分离跨域请求时 ajax并发请求导致部分无法通过验证解决办法。
项目中有这样一个页面.页面加载的时候会同时并发6个ajax请求去后端请求下拉框. 这样会导致每次都有1~2个“浏览器预请求”不通过. 浏览器为什么会自动发送“预请求”?请看以面连接 https://b ...
- nginx-springboot-vue前后端分离跨域配置
nginx-springboot-vue前后端分离跨域配置 引言 接着上篇--简单的springboot-vue前后端分离登录Session拦截的demo,其中跨域是通过springboot后端全局设 ...
- $Django 前后端之 跨域问题(同源策略) vue项目(axios跨域请求数据)
1 跨域问题(多个域之间的数据访问) #同源策略(ip port 协议全部相同) #本站的只能请求本站域名的数据 #CORS实现(跨域资源共享) #实现CORS通信的关键是服务器.只要服务器实现了CO ...
- nginx反向代理实现前后端分离&跨域问题
1.代理和跨域 1.1 正向代理 1)用户希望代理服务器帮助其和要访问服务器之间实现通信,需要: a.用户IP报文的目的IP=代理服务器IP: b.用户报文端口号=代理服务器监听端口号: c.HTTP ...
- 前后端分离跨域 关于前后端分离开发环境下的跨域访问问题(angular proxy=>nginx )
前后端分离后遇到了跨域访问的问题: angular1中使用proxy很麻烦,最后还是失败结束:最后总结3种方法如下: 本人使用的第一种方法,只是开发环境下使用很方便! 1:禁掉谷歌的安全策略(Turn ...
- spingsecurity 前后端分离跨域,ajax无用户信息
1.自测时用的postman没有任何问题 2.和前端对接时发现登录不上,ajax Error 出错:{"readyState":0,"responseText" ...
- node与vue结合的前后端分离跨域问题
第一点:node作为服务端提供数据接口,vue使用axios访问接口, 安装axios npm install axios --save 安装完成后在main.js中增加一下配置: import ax ...
- Beego和Vue的前后端分离跨域问题处理
VUE封装的请求头(注意请求头,跨域要用到) 路径 utils/mereq.js import request from '@/utils/request' import qs from 'qs' e ...
- nginx配置反向代理解决前后端分离跨域问题
摘自<AngularJS深度剖析与最佳实践>P132 nginx配置文件如下: server { listen ; server_name your.domain.name; locati ...
随机推荐
- 108天南京银行完成不可能完成的新金融DevOps转型
在2018云栖大会南京峰会企业研发云专场,由南京银行研发管理负责人吴攀带来了“云效助力新金融DevOps转型——南京银行实践之路”的主题分享.首先对南京银行的研发规模与成长做了介绍,对“鑫云+”的诞生 ...
- win7 开机,或重启自动启动 该文件下的
win7 开机,或重启自动启动 该文件下的: 把桌面上快捷键放入文件内就行 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start ...
- [USACO17FEB]Why Did the Cow Cross the Road III G (树状数组,排序)
题目链接 Solution 二维偏序问题. 现将所有点按照左端点排序,如此以来从左至右便满足了 \(a_i<a_j\) . 接下来对于任意一个点 \(j\) ,其之前的所有节点都满足 \(a_i ...
- BUUCTF |[0CTF 2016]piapiapia
步骤: nickname[]=wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere ...
- [CSP-S模拟测试97]题解
A.小盆友的游戏 感觉题解解释的很牵强啊……还是打表找规律比较靠谱 对于每个人,它构造了一个期望函数$f(x)$,设它的跟班个数为$cnt[x]$,那么令$f(x)=2^{cnt[x]}-1$(??鬼 ...
- promise以及async、await学习总结
Promise/async.await帮我们解决了什么 它给我们提供了一种新的异步编程解决方案,同时避免了困扰已久的回调地狱 // 异步的处理可能会产生这样的回调地狱(第二个异步操作和第一个异步的结果 ...
- 台哥原创:java 俄罗斯方块源码
大四的时候,用java开发,耗时一周 界面参照当时用的联想手机里的俄罗斯方块 这里的级别,标识难度,1是初级,方块下降速度很慢,5是最高级,下降速度最快 得分:每消除一行,会给10分,同时消除 ...
- 原来在UNITY中使用system.io下的所有函数都可以用相对路径 : Assets/xx
代码如下图,这样就不用在绝对路径和相对路径之间不断转换了. 想要得到绝对路径时就傅 Application.dataPath + xxx using System.Collections; usin ...
- webpack 常用配置
webpack.config.js const path = require('path'); const webpack = require('webpack'); const htmlWebpac ...
- git 时 出现 Permission denied (publickey).
https://blog.csdn.net/awp0011/article/details/73368481 第一次使用github.com在本地 执行 git clone git@github.co ...