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 开发Activex组件方法
Nov 08 Python
Python cx_freeze打包工具处理问题思路及解决办法
Feb 13 Python
python安装oracle扩展及数据库连接方法
Feb 21 Python
python监控linux内存并写入mongodb(推荐)
Sep 11 Python
Python生成器以及应用实例解析
Feb 08 Python
pyside+pyqt实现鼠标右键菜单功能
Dec 08 Python
PyQt5 多窗口连接实例
Jun 19 Python
树莓派动作捕捉抓拍存储图像脚本
Jun 22 Python
基于Python新建用户并产生随机密码过程解析
Oct 08 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
Jan 19 Python
python logging设置level失败的解决方法
Feb 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 array_intersect比array_diff快(附详细的使用说明)
2011/07/03 PHP
PHP数组实例总结与说明
2011/08/23 PHP
如何在PHP中使用正则表达式进行查找替换
2013/06/13 PHP
使用CodeIgniter的类库做图片上传
2014/06/12 PHP
php简单定时执行任务的实现方法
2015/02/23 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
javascript String 的扩展方法集合
2008/06/01 Javascript
jQuery插件开发基础简单介绍
2013/01/07 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
2015/08/12 Javascript
跟我学习javascript的prototype,getPrototypeOf和__proto__
2015/11/17 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
JavaScript驾驭网页-获取网页元素
2016/03/24 Javascript
JS简单实现自定义右键菜单实例
2017/05/31 Javascript
JS删除数组里的某个元素方法
2018/02/03 Javascript
layui实现数据分页功能
2019/07/27 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
原生JavaScript实现购物车
2021/01/10 Javascript
[01:45]DOTA2众星出演!DSPL刀塔次级职业联赛宣传片
2014/11/21 DOTA
Python工程师面试题 与Python基础语法相关
2016/01/14 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
Tensorflow读取并输出已保存模型的权重数值方式
2020/01/04 Python
Python selenium页面加载慢超时的解决方案
2020/03/18 Python
python3安装OCR识别库tesserocr过程图解
2020/04/02 Python
python定义类的简单用法
2020/07/24 Python
学前教育毕业生自荐信
2013/10/29 职场文书
夏季奶茶店创业计划书
2014/01/16 职场文书
十佳护士获奖感言
2014/02/18 职场文书
服务行业口号
2014/06/11 职场文书
交通安全责任书范本
2014/07/24 职场文书
离婚协议书范本(2014版)
2014/09/28 职场文书
2014年民警工作总结
2014/11/25 职场文书
幼儿园教师工作总结2015
2015/04/02 职场文书
上课讲话检讨书范文
2015/05/07 职场文书
公诉意见书范文
2015/06/05 职场文书
巧用 -webkit-box-reflect 倒影实现各类动效(小结)
2021/04/22 HTML / CSS
如何通过cmd 连接阿里云服务器
2022/04/18 Servers