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 MD5文件生成码
Jan 12 Python
python 正则式 概述及常用字符
May 07 Python
windows系统中python使用rar命令压缩多个文件夹示例
May 06 Python
举例区分Python中的浅复制与深复制
Jul 02 Python
Python数据类型学习笔记
Jan 13 Python
Python递归函数实例讲解
Feb 27 Python
Python分支语句与循环语句应用实例分析
May 07 Python
Python利用神经网络解决非线性回归问题实例详解
Jul 19 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
Oct 14 Python
pycharm运行scrapy过程图解
Nov 22 Python
python range实例用法分享
Feb 06 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
Mar 04 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
Win2003+apache+PHP+SqlServer2008 配置生产环境
2014/07/29 PHP
PHP使用Nginx实现反向代理
2017/09/20 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
jquery 回车事件实现代码
2011/08/23 Javascript
javascript陷阱 一不小心你就中招了(字符运算)
2013/11/10 Javascript
jquery删除ID为sNews的tr元素的内容
2014/04/10 Javascript
JavaScript删除指定子元素代码实例
2015/01/13 Javascript
jQuery实现文件上传进度条特效
2015/08/12 Javascript
js实现tab切换效果实例
2015/09/16 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
基于jPlayer三分屏的制作方法
2016/12/21 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
ES6中Class类的静态方法实例小结
2017/10/28 Javascript
Node.js 实现抢票小工具 &amp; 短信通知提醒功能
2019/10/22 Javascript
JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】
2020/05/01 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
vue动态设置路由权限的主要思路
2021/01/13 Vue.js
Python控制多进程与多线程并发数总结
2016/10/26 Python
python多进程使用及线程池的使用方法代码详解
2018/10/24 Python
django使用LDAP验证的方法示例
2018/12/10 Python
django项目中新增app的2种实现方法
2020/04/01 Python
浅谈keras 的抽象后端(from keras import backend as K)
2020/06/16 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
2020/09/26 Python
Django缓存Cache使用详解
2020/11/30 Python
CSS3属性box-shadow使用指南
2014/12/09 HTML / CSS
Wedgwood美国官网:英国骨瓷,精美礼品及家居装饰
2018/02/17 全球购物
英国乡村时尚和宠物用品专家:Pet & Country
2018/07/02 全球购物
加拿大大码女装购物网站:Penningtons
2020/12/26 全球购物
大专毕业生简历的自我评价
2013/10/20 职场文书
优秀的计算机专业求职信范文
2013/12/27 职场文书
机关工会开展学习雷锋活动总结
2014/03/01 职场文书
高中学生评语大全
2014/04/25 职场文书
解除劳动合同协议书(样本)
2014/10/02 职场文书
企业财务管理制度范本
2015/08/04 职场文书
餐厅服务员管理制度
2015/08/05 职场文书
Python实现视频自动打码的示例代码
2022/04/08 Python