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 把文件中的每一行以数组的元素放入数组中的方法
Apr 29 Python
在NumPy中创建空数组/矩阵的方法
Jun 15 Python
Python 一句话生成字母表的方法
Jan 02 Python
Python字符串逆序输出的实例讲解
Feb 16 Python
python处理“
Jun 10 Python
通过python实现随机交换礼物程序详解
Jul 10 Python
python flask中动态URL规则详解
Nov 22 Python
如何将 awk 脚本移植到 Python
Dec 09 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
Feb 06 Python
Django之全局使用request.user.username的实例详解
May 14 Python
关于python爬虫应用urllib库作用分析
Sep 04 Python
浅谈Python中对象是如何被调用的
Apr 06 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
人大复印资料处理程序_补充篇
2006/10/09 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
2011/05/29 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
2016/03/22 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
js 获取计算后的样式写法及注意事项
2013/02/25 Javascript
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
基于Jquery+Ajax+Json实现分页显示附效果图
2014/07/30 Javascript
原生JavaScript实现异步多文件上传
2015/12/02 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
Document.body.scrollTop的值总为零的快速解决办法
2016/06/09 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
2017/04/28 Javascript
vuex中使用对象展开运算符的示例
2017/09/25 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
2018/01/09 Javascript
JS 实现微信扫一扫功能
2018/09/14 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
M2实现Nodejs项目自动部署的方法步骤
2019/05/05 NodeJs
详解vue+axios给开发环境和生产环境配置不同的接口地址
2019/08/16 Javascript
JS中比Switch...Case更优雅的多条件判断写法
2019/09/05 Javascript
Django中模版的子目录与include标签的使用方法
2015/07/16 Python
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
pytorch+lstm实现的pos示例
2020/01/14 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
企划专员岗位职责
2013/12/09 职场文书
竞聘副主任科员演讲稿
2014/01/11 职场文书
小学教师听课制度
2014/02/01 职场文书
个人作风剖析材料
2014/02/02 职场文书
店面销售职位的职责
2014/03/09 职场文书
教师节标语大全
2014/10/07 职场文书
目标责任书格式范文
2015/05/11 职场文书
幸福终点站观后感
2015/06/04 职场文书
教师岗位说明书
2015/09/30 职场文书
2016年清明节网上祭英烈活动总结
2016/04/01 职场文书
使用nginx动态转换图片大小生成缩略图
2021/03/31 Servers