$Django 前后端之 跨域问题(同源策略) vue项目(axios跨域请求数据)
1 跨域问题(多个域之间的数据访问)
#同源策略(ip port 协议全部相同)
#本站的只能请求本站域名的数据
#CORS实现(跨域资源共享)
#实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
#CORS基本流程 #1_CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request) #2_满足一下为简单请求
(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 #3_简单请求和非简单请求的区别? 简单请求:一次请求
非简单请求:两次请求,在发送数据之前会先发一次请求用于做“预检”,只有“预检”通过后才再发送一次请求用于数据传输。
* 关于“预检” - 预检请求方式:OPTIONS
- “预检”其实做检查,检查如果通过则允许传输数据,检查不通过则不再发送真正想要发送的消息
- 如何“预检”
=> 如果复杂请求是PUT等请求,则服务端需要设置允许某请求,否则“预检”不通过
Access-Control-Request-Method
=> 如果复杂请求设置了请求头,则服务端需要设置允许某请求头,否则“预检”不通过
Access-Control-Request-Headers
from django.utils.deprecation import MiddlewareMixin
#view局部
def test(request):
ret=HttpResponse('ok')
#允许http://127.0.0.1:8001域向我发请求
ret['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8000'
if request.method == 'OPTIONS':
# 所有的头信息都允许
ret['Access-Control-Allow-Headers'] = '*'
return ret
#设置中间件(全局)
class xxx(MiddlewareMixin):
def process_response (self, request, response):
# 简单请求:
# 允许http://127.0.0.1:8001域向我发请求
# ret['Access-Control-Allow-Origin']='http://127.0.0.1:8001'
# 允许所有域向我发请求
response['Access-Control-Allow-Origin'] = '*'
if request.method == 'OPTIONS':
# 所有的头信息都允许
response['Access-Control-Allow-Headers'] = '*'
return response
django中的cors(view设置以及中间件设置)
注意点1:有个csrf跨域防伪(允许别的域访问的 域 要把csrf中间件注掉 | 视图全部继承apiview,as_view 返回了 csrf_exempt(view) )
ret['Access-Control-Request-Header']='contenttype,token'
2 vue中的(axios跨域请求数据)
vue中的ajax:
axios
安装:npm install axios
使用:
-先在main.js中配置:
import axios from 'axios'
Vue.prototype.$http=axios
-在组件中:
methods: {
btton_click: function () {
//取到对象
let cc = this
cc.$http.request({
//向其它域请求数据
url: 'http://127.0.0.1:8000/test/',
method: 'post',
data:{
//携带数据
}
}).then(function (response) {
//拿到原数据对象,更新
cc.course = response.data
}).catch(function (response) {
//请求失败
})
}
}
随机推荐
- 解决ubuntu中arm-linux-gcc not found
1. 注意检查是不是 换了bash的原因 2. 此外还有权限切换以后环境变量换了 3.如果遇到环境变量配置以后,能够找到版本(也就是说 输入 命令的开头按tab以后能够出现补全),这是因为64位下运行 ...
- hibernate状态转换关系图【原】
hibernate状态转换 其它参考 简单理解Hibernate三种状态的概念及互相转化 简单的Hibernate入门介绍
- 数据库操作中如何批量执行多个sql文件?
数据库操作中如何批量执行多个sql文件? 1.应用场景:在历史数据导入过程中,会发现有很多个表形成的.sql文件,要是一个一个文件去手动执行,实在是费时间,所以采取以下方法. 2.将文件放在一定位置, ...
- 【leetcode-100】 简单 树相关题目
100. 相同的树 (1过,熟练) 给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 1: 输入: 1 1 / \ / \ 2 ...
- IntelliJ IDEA(2017)安装和破解
IDEA 全称 IntelliJ IDEA,是Java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支持.各类版本工具( ...
- 031、none和host网络的适用场景(2019-02-18 周一)
参考https://www.cnblogs.com/CloudMan6/p/7053617.html 本节开始,会学习docker的几种原生网络,以及如何创建自定义网络.然后探究容器之间如何通信, ...
- MyBatis简单使用和入门理解
本文记录第一次使用Mybatis时碰到的一些错误和简单理解,采用的示例是Eclipse中的JAVA工程,采用XML文件定义数据库连接. 可以使用Java JDBC API直接操作数据库,但使用框架会更 ...
- springboot(十三):springboot结合mybatis generator逆向工程自动生成代码
错信息generate failed: Exception getting JDBC Driver: com.mysql.jdbc.Driver 上网查了一下,发现原来是generator这个插件在运 ...
- 【三】Eureka服务注册与发现
1.是什么 Eureka是Netflix的一个子模块,也是核心模块之一.Eureka是一个基于 REST 服务,用于定位服务,以实现云端中间层服务发现和故障转移.服务注册与发现对于微服务架构来说是非常 ...
- linux下有名管道进程通信
一.任务 1.学习mkfifo等函数: 2.了解有名管道的特点.阻塞打开与非阻塞打开等: 3.编写一个关于有名管道进程通信的程序,并运行. 二.相关概念 1.相关函数 创建有名管道的函数是mkfifo ...