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调用cmd复制文件代码分享
Dec 27 Python
推荐11个实用Python库
Jan 23 Python
Python的pycurl包用法简介
Nov 13 Python
Python的Flask框架中的Jinja2模板引擎学习教程
Jun 30 Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 Python
python利用插值法对折线进行平滑曲线处理
Dec 25 Python
python学习--使用QQ邮箱发送邮件代码实例
Apr 16 Python
Python+OpenCV实现实时眼动追踪的示例代码
Nov 11 Python
Pycharm最常用的快捷键及使用技巧
Mar 05 Python
浅谈Python 钉钉报警必备知识系统讲解
Aug 17 Python
Python 中的函数装饰器和闭包详解
Feb 06 Python
Python time库的时间时钟处理
May 02 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 array_intersect比array_diff快(附详细的使用说明)
2011/07/03 PHP
2014年10个最佳的PHP图像操作库
2014/07/14 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
2014/10/15 PHP
基于PHP后台的Android新闻浏览客户端
2016/05/23 PHP
asp函数split()对应php函数explode()
2019/02/27 PHP
YII框架页面缓存操作示例
2019/04/29 PHP
初窥JQuery(二)事件机制(2)
2010/12/06 Javascript
JavaScript函数使用的基本教程
2015/06/04 Javascript
举例详解AngularJS中ngShow和ngHide的使用方法
2015/06/19 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
2016/01/26 Javascript
Angular2下使用pdf插件的方法详解
2017/04/29 Javascript
angular中实现li或者某个元素点击变色的两种方法
2017/07/27 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
2020/08/09 Javascript
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
在React项目中使用Eslint代码检查工具及常见问题
2018/10/10 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
vue和better-scroll实现列表左右联动效果详解
2019/04/29 Javascript
vue2.0项目集成Cesium的实现方法
2019/07/30 Javascript
JavaScript基础之this和箭头函数详析
2019/09/05 Javascript
JavaScript RegExp 对象用法详解
2019/09/24 Javascript
[05:03]显微镜下的DOTA2第十期——Ti3豪之超神幽鬼
2014/06/23 DOTA
一篇不错的Python入门教程
2007/02/08 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
python文件写入write()的操作
2019/05/14 Python
python将邻接矩阵输出成图的实现
2019/11/21 Python
如何基于Python创建目录文件夹
2019/12/31 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
2020/01/03 Python
python反扒机制的5种解决方法
2021/02/06 Python
CSS3绘制超炫的上下起伏波动进度加载动画
2016/04/21 HTML / CSS
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
欧洲当代手工玻璃和瓷器的领先品牌:LSA International
2018/06/03 全球购物
加热夹克:RAVEAN
2018/10/19 全球购物
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
美术师范毕业生自荐信
2013/11/16 职场文书
三八妇女节标语
2014/10/09 职场文书