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 ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
Jun 10 Python
在Linux系统上通过uWSGI配置Nginx+Python环境的教程
Dec 25 Python
Python文本相似性计算之编辑距离详解
Nov 28 Python
Python实现的爬虫功能代码
Jun 24 Python
django静态文件加载的方法
May 20 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
Jun 11 Python
Python设计模式之桥接模式原理与用法实例分析
Jan 10 Python
python使用Pandas库提升项目的运行速度过程详解
Jul 12 Python
python文字转语音实现过程解析
Nov 12 Python
Python中flatten( ),matrix.A用法说明
Jul 05 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
Sep 11 Python
matplotlib教程——强大的python作图工具库
Oct 15 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_walk_recursive 使用自定的函数处理数组中的每一个元素
2016/11/16 PHP
php回调函数处理数组操作示例
2020/04/13 PHP
javascript面向对象的方式实现的弹出层效果代码
2010/01/28 Javascript
jquery.validate使用攻略 第二部
2010/07/01 Javascript
将Datatable转化成json发送前台实现思路
2013/09/06 Javascript
node.js入门教程迷你书、node.js入门web应用开发完全示例
2014/04/06 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
深入理解JavaScript系列(41):设计模式之模板方法详解
2015/03/04 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
学习Javascript面向对象编程之封装
2016/02/23 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
2016/10/19 Javascript
Vue基础配置讲解
2019/11/29 Javascript
JavaScript代码异常监控实现过程详解
2020/02/17 Javascript
[02:15]你好,这就是DOTA!
2015/08/05 DOTA
python选择排序算法的实现代码
2013/11/21 Python
Python中for循环详解
2014/01/17 Python
Python实现网站文件的全备份和差异备份
2014/11/30 Python
python的socket编程入门
2018/01/29 Python
Python爬虫实战:分析《战狼2》豆瓣影评
2018/03/26 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
pandas DataFrame索引行列的实现
2019/06/04 Python
TensorFLow 变量命名空间实例
2020/02/11 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
2020/02/28 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
2020/04/27 Python
python和JavaScript哪个容易上手
2020/06/23 Python
Python绘制组合图的示例
2020/09/18 Python
中国跨境海淘网站:考拉海购
2016/08/01 全球购物
日本高端护肤品牌:Tatcha
2016/08/29 全球购物
西班牙语在线票务市场:SuperBoletería
2019/06/10 全球购物
英语商务邀请函范文
2014/01/16 职场文书
2014年教师党员自我评价范文
2014/09/22 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
毕业论文指导教师评语
2014/12/30 职场文书
趣味运动会广播稿
2015/08/19 职场文书
2015年店长个人工作总结
2015/10/23 职场文书