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实现的文件同步服务器实例
Jun 02 Python
浅析Python中yield关键词的作用与用法
Nov 29 Python
matplotlib绘图实例演示标记路径
Jan 23 Python
详解Python判定IP地址合法性的三种方法
Mar 06 Python
Flask框架信号用法实例分析
Jul 24 Python
浅谈Python接口对json串的处理方法
Dec 19 Python
python flask框架实现重定向功能示例
Jul 02 Python
简单介绍python封装的基本知识
Aug 10 Python
Python 中使用 PyMySQL模块操作数据库的方法
Nov 10 Python
Django ORM实现按天获取数据去重求和例子
May 18 Python
pyqt5 textEdit、lineEdit操作的示例代码
Aug 12 Python
matplotlib之pyplot模块之标题(title()和suptitle())
Feb 22 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 构造函数construct的前下划线是双的_
2009/12/08 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十四)
2014/06/26 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
2015/04/15 PHP
PHP会话操作之cookie用法分析
2016/09/28 PHP
yii2实现 &quot;上一篇,下一篇&quot; 功能的代码实例
2017/02/04 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
HTML-CSS群中单选引发的“事件”
2007/03/05 Javascript
学习ExtJS Window常用方法
2009/10/07 Javascript
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
js改变鼠标的形状和样式的方法
2014/03/31 Javascript
一个JS函数搞定网页标题(title)闪动效果
2014/05/13 Javascript
Node.js实现数据推送
2016/04/14 Javascript
移动web开发之touch事件实例详解
2018/01/17 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
2018/08/19 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
2019/04/30 Javascript
jQuery实现高度灵活的表单验证功能示例【无UI】
2020/04/30 jQuery
解决vue一个页面中复用同一个echarts组件的问题
2020/07/19 Javascript
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
2020/12/19 Vue.js
python读取浮点数和读取文本文件示例
2014/05/06 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
详解Python 协程的详细用法使用和例子
2018/06/15 Python
win7 x64系统中安装Scrapy的方法
2018/11/18 Python
Python闭包和装饰器用法实例详解
2019/05/22 Python
Python代码实现http/https代理服务器的脚本
2019/08/12 Python
使用python脚本自动创建pip.ini配置文件代码实例
2019/09/20 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
HTML5 图片预加载的示例代码
2020/03/25 HTML / CSS
俄罗斯电动工具和设备购物网站:Vseinstrumenti.ru
2020/11/12 全球购物
安全生产检讨书
2014/01/21 职场文书
小学教师师德演讲稿
2014/05/06 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
教师个人年度总结
2015/02/11 职场文书
学校少先队工作总结
2015/08/12 职场文书
Python如何导出导入所有依赖包详解
2021/06/08 Python
Python Django ORM连表正反操作技巧
2021/06/13 Python
从零开始在Centos7上部署SpringBoot项目
2022/04/07 Servers