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使用PyV8执行javascript代码示例分享
Dec 04 Python
Python中关键字is与==的区别简述
Jul 31 Python
速记Python布尔值
Nov 09 Python
Python中的pack和unpack的使用
Mar 12 Python
python 实现判断ip连通性的方法总结
Apr 22 Python
python线程池threadpool实现篇
Apr 27 Python
Python for循环生成列表的实例
Jun 15 Python
Python中判断子串存在的性能比较及分析总结
Jun 23 Python
Python 实现输入任意多个数,并计算其平均值的例子
Jul 16 Python
基于python和flask实现http接口过程解析
Jun 15 Python
python list等分并从等分的子集中随机选取一个数
Nov 16 Python
python3 使用ssh隧道连接mysql的操作
Dec 05 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
Sony CFR 320 修复改造
2020/03/14 无线电
PHP中的替代语法简介
2014/08/22 PHP
Laravel 4 初级教程之Pages、表单验证
2014/10/30 PHP
html静态页面调用php文件的方法
2014/11/13 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
PHP实现数组的笛卡尔积运算示例
2017/12/15 PHP
php 中self,this的区别和操作方法实例分析
2019/11/04 PHP
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
IE与FireFox的JavaScript兼容问题解决办法
2013/12/31 Javascript
require.js深入了解 require.js特性介绍
2014/09/04 Javascript
基于Arcgis for javascript实现百度地图ABCD marker的效果
2015/09/12 Javascript
基于javascript bootstrap实现生日日期联动选择
2016/04/07 Javascript
three.js绘制地球、飞机与轨迹的效果示例
2017/02/28 Javascript
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
2017/03/04 Javascript
Vue.js划分组件的方法
2017/10/29 Javascript
vue绑定的点击事件阻止冒泡的实例
2018/02/08 Javascript
js实现黑白div块画空心的图形
2018/12/13 Javascript
vue3.0 上手体验
2020/09/21 Javascript
python 简单的多线程链接实现代码
2016/08/28 Python
windows及linux环境下永久修改pip镜像源的方法
2016/11/28 Python
python实现解数独程序代码
2017/04/12 Python
python文件名和文件路径操作实例
2017/09/29 Python
python xpath获取页面注释的方法
2019/01/14 Python
如何基于python3和Vue实现AES数据加密
2020/03/27 Python
乌克兰香水和化妆品网站:Notino.ua
2018/03/26 全球购物
面临毕业的毕业生自荐书范文
2014/02/05 职场文书
各营销点岗位职责范本
2014/03/05 职场文书
沙滩主题婚礼活动策划方案
2014/09/15 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
健康状况证明书
2014/11/26 职场文书
副总经理岗位职责范本
2015/04/08 职场文书
如何用python绘制雷达图
2021/04/24 Python
python 下划线的多种应用场景总结
2021/05/12 Python
Docker官方工具docker-registry案例演示
2022/04/13 Servers
SpringCloud超详细讲解Feign声明式服务调用
2022/06/21 Java/Android