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中实现远程调用(RPC、RMI)简单例子
Apr 28 Python
Python tempfile模块学习笔记(临时文件)
May 25 Python
Python读写及备份oracle数据库操作示例
May 17 Python
Python使用googletrans报错的解决方法
Sep 25 Python
介绍一款python类型检查工具pyright(推荐)
Jul 03 Python
python读取并写入mat文件的方法
Jul 12 Python
pytorch实现线性拟合方式
Jan 15 Python
在TensorFlow中实现矩阵维度扩展
May 22 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
Jan 06 Python
Python基础之教你怎么在M1系统上使用pandas
May 08 Python
python实现简单石头剪刀布游戏
Oct 24 Python
Elasticsearch 聚合查询和排序
Apr 19 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中http_build_query 的一个问题
2012/03/25 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
2014/11/12 PHP
PHP页面间传递值和保持值的方法
2016/08/24 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
2019/10/11 PHP
利用javascript查看html源文件
2006/11/08 Javascript
javascript数组组合成字符串的脚本
2021/01/06 Javascript
JavaScript 异步调用框架 (Part 3 - 代码实现)
2009/08/04 Javascript
自己动手制作jquery插件之自动添加删除行功能介绍
2011/10/14 Javascript
浅谈重写window对象的方法
2014/12/29 Javascript
jquery制作 随机弹跳的小球特效
2015/02/01 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
jquery自定义右键菜单、全选、不连续选择
2016/03/01 Javascript
jQuery动态加载css文件实现方法
2016/06/15 Javascript
微信小程序如何获知用户运行小程序的场景教程
2017/05/17 Javascript
AngularJS自定义指令实现面包屑功能完整实例
2017/05/17 Javascript
详解JavaScript 中 if / if...else...替换方式
2018/07/15 Javascript
详解react native页面间传递数据的几种方式
2018/11/07 Javascript
vue element动态渲染、移除表单并添加验证的实现
2019/01/16 Javascript
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
[26:52]LGD vs EG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python使用QQ邮箱发送Email的方法实例
2017/02/09 Python
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
python 解决flask 图片在线浏览或者直接下载的问题
2020/01/09 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
马来西亚最好的婴儿商店:Motherhood
2017/09/14 全球购物
美国二手复古奢侈品包包购物网站:LXRandCo
2019/06/18 全球购物
沙特阿拉伯电子产品和家用电器购物网站:Black Box
2019/07/24 全球购物
JSF的标签库有哪些
2012/04/27 面试题
大学生通用个人的自我评价
2014/02/10 职场文书
幼儿园安全责任书
2014/04/14 职场文书
让世界充满爱观后感
2015/06/10 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书
Java实现斗地主之洗牌发牌
2021/06/14 Java/Android
python scrapy简单模拟登录的代码分析
2021/07/21 Python
Mysql开启外网访问
2022/05/15 MySQL