Django实现跨域请求过程详解


Posted in Python onJuly 25, 2019

前言

CORS 即 Cross Origin Resource Sharing 跨域资源共享.

跨域请求分两种:简单请求、复杂请求.

简单请求

简单请求必须满足下述条件.

HTTP方法为这三种方法之一:HEAD、GET、POST

HTTP头消息不超出以下字段:

Accept、Accept-Language、Content-Language、Last-Event-ID

且Content-Type只能为下列类型中的某一个:

  • application/x-www-from-urlencoded
  • multipart/form-data
  • text/plain.

==任何不满足上述要求的请求,都会被认为是复杂请求.

复杂请求会先发出一个预请求——预检,OPTIONS请求.==

浏览器的同源策略

无法跨域就是被浏览器的同源策略限制的.

也就是说,==浏览器会阻止非同源的请求.==

那什么是非同源呢?==域名或端口不同的,都属于非同源.==

==浏览器只会阻止表单以及Ajax请求的跨域,但不会阻止src请求跨域.==

所以,我们的cdn、图片等src请求都是正常的.

JsonP实现跨域

==JsonP跨域的原理是利用了浏览器不阻止src请求跨域来实现的.==

==JsonP只能实现GET请求跨域.==

首先 准备我们的视图文件

from django.http import HttpResponse
from rest_framework.views import APIView

class TestView(APIView):
  def get(self, request):
    return HttpResponse("handlerResponse('is ok')")
    # 注意返回的函数以及参数的格式

然后 HTML文件

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <title>JsonP跨站请求测试</title>
</head>
<body>
<script>
  // 函数名应为handlerResponse,这是一种约定俗成
  function handlerResponse(data) {
    alert(data)
  }
</script>
<!--必须放在被执行函数的script标签的下面,否则会报错函数不存在-->
<script src="http://127.0.0.1:8000/test/"></script>
</body>
</html>

好了 我们来测试吧

Django实现跨域请求过程详解

可以看到,我们成功实现了跨域获取数据.

JsonP解决跨域只能发送GET请求,并且实现起来前后端交互会比较多,现在几乎已经不在使用了

在Django中间件中添加响应头

可实现简单请求和复杂请求的跨域

第一步 准备中间件

from django.utils.deprecation import MiddlewareMixin

class MyCors(MiddlewareMixin):
  def process_response(self, request, response):
    # 如下,等于'*'后,便可允许所有简单请求的跨域访问
    response['Access-Control-Allow-Origin'] = '*'

    # 判断是否为复杂请求
    if request.method == 'OPTIONS':
      response['Access-Control-Allow-Headers'] = 'Content-Type'
      response['Access-Control-Allow-Methods'] = 'PUT,PATCH,DELETE'

    return response

写好之后,别忘记了去注册.

第二步 视图文件

from django.http import HttpResponse
from rest_framework.views import APIView

class TestView(APIView):
  def get(self, request):
    return HttpResponse("这是GET请求的数据")
  def post(self, request):
    return HttpResponse("这是POST请求的数据")
  def put(self, request):
    return HttpResponse("这是PUT请求的数")

第三步 HTML文件

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
  <title>test</title>
</head>
<body>
<button id="sign">点击发送跨站请求</button>
<script>
  $('#sign').click(function () {
    $.ajax({
      url: 'http://127.0.0.1:8000/test/', // 要访问的外站
      type: 'put', // 请求类型, put为复杂请求
      contentType: 'application/json', // 指定为'application/json'后,将变为复杂请求
      success: function (data) {
        // 请求成功后将执行该函数
        // data是外站发送过来的数据
        alert(data)
      },
    });
  });
</script>
</body>
</html>

测试效果如下

Django实现跨域请求过程详解

可见,我们实现了复杂请求的跨域,简单请求就更不用说了.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现的堆排序算法原理与用法实例分析
Nov 22 Python
python实现外卖信息管理系统
Jan 11 Python
Python3.6笔记之将程序运行结果输出到文件的方法
Apr 22 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
Dec 07 Python
python实现栅栏加解密 支持密钥加密
Mar 20 Python
纯python进行矩阵的相乘运算的方法示例
Jul 17 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
Feb 11 Python
Python数组并集交集补集代码实例
Feb 18 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
May 22 Python
树莓派4B安装Tensorflow的方法步骤
Jul 16 Python
pandas使用函数批量处理数据(map、apply、applymap)
Nov 27 Python
python3实现无权最短路径的方法
May 12 Python
Django Rest framework认证组件详细用法
Jul 25 #Python
Django Rest framework权限的详细用法
Jul 25 #Python
Django Rest framework解析器和渲染器详解
Jul 25 #Python
Django Form 实时从数据库中获取数据的操作方法
Jul 25 #Python
Django MEDIA的配置及用法详解
Jul 25 #Python
Django打印出在数据库中执行的语句问题
Jul 25 #Python
python requests指定出口ip的例子
Jul 25 #Python
You might like
PHP的cURL库功能简介 抓取网页、POST数据及其他
2011/04/07 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
php利用事务处理转账问题
2015/04/22 PHP
Laravel框架实现利用监听器进行sql语句记录功能
2018/06/06 PHP
php实现数字补零的方法总结
2018/09/12 PHP
IE关闭时判断及AJAX注销案例学习
2013/02/18 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
jQuery实现进度条效果代码
2015/12/17 Javascript
javascript正则表达式总结
2016/02/29 Javascript
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
vue计算属性时v-for处理数组时遇到的一个bug问题
2018/01/21 Javascript
vue 标签属性数据绑定和拼接的实现方法
2018/05/17 Javascript
Vue父子传递实例讲解
2020/02/14 Javascript
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
在Python的Django框架中获取单个对象数据的简单方法
2015/07/17 Python
Python matplotlib画图与中文设置操作实例分析
2019/04/23 Python
wxPython窗体拆分布局基础组件
2019/11/19 Python
tensorflow 重置/清除计算图的实现
2020/01/19 Python
Python数据可视化实现多种图例代码详解
2020/07/14 Python
记录一下scrapy中settings的一些配置小结
2020/09/28 Python
Python远程linux执行命令实现
2020/11/11 Python
Python关于拓扑排序知识点讲解
2021/01/04 Python
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
OLEDBConnection和SQLConnection有什么区别
2013/05/31 面试题
服装电子商务创业计划书
2014/01/30 职场文书
写好自荐信需做到的5要点
2014/03/07 职场文书
群众路线教育党课主持词
2014/04/01 职场文书
祖国在我心中演讲稿600字
2014/05/04 职场文书
中学教师师德师风演讲稿
2014/08/22 职场文书
廉政承诺书
2015/01/19 职场文书
银行柜员优质服务心得体会
2016/01/22 职场文书
公安纪律作风整顿心得体会
2016/01/23 职场文书
室外天线与收音机天线杆接合方法
2022/04/05 无线电
Python简易开发之制作计算器
2022/04/28 Python