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进阶教程之函数参数的多种传递方法
Aug 30 Python
python3实现短网址和数字相互转换的方法
Apr 28 Python
Python减少循环层次和缩进的技巧分析
Mar 15 Python
多版本Python共存的配置方法
May 22 Python
Python编程之列表操作实例详解【创建、使用、更新、删除】
Jul 22 Python
Python代码实现KNN算法
Dec 20 Python
python爬虫增加访问量的方法
Aug 22 Python
Python包,__init__.py功能与用法分析
Jan 07 Python
windows下的pycharm安装及其设置中文菜单
Apr 23 Python
Python读入mnist二进制图像文件并显示实例
Apr 24 Python
让Django的BooleanField支持字符串形式的输入方式
May 20 Python
python 利用 PIL 将数组值转成图片的实现
Apr 12 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
理解Javascript_08_函数对象
2010/10/15 Javascript
js 弹出菜单/窗口效果
2011/10/30 Javascript
JS的千分位算法实现思路
2013/07/31 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
JS实现日期加减的方法
2013/11/29 Javascript
jQuery实用函数用法总结
2014/08/29 Javascript
JS实现向表格中动态添加行的方法
2015/03/30 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
2015/08/07 Javascript
JavaScript知识点总结之如何提高性能
2016/01/15 Javascript
轻松搞定jQuery.noConflict()
2016/02/15 Javascript
js中时间格式化的几种方法
2018/07/22 Javascript
小程序调用微信支付的方法
2019/09/26 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
2019/12/02 Javascript
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
python数据清洗系列之字符串处理详解
2017/02/12 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
python入门教程 python入门神图一张
2018/03/05 Python
彻底理解Python中的yield关键字
2019/04/01 Python
详解用Python进行时间序列预测的7种方法
2020/03/13 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
国外平面设计第一市场:99designs
2016/10/25 全球购物
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
星空联盟C# .net笔试题
2014/12/05 面试题
装潢设计专业推荐信模板
2013/11/26 职场文书
组织关系转移介绍信
2014/01/16 职场文书
测绘专业大学生职业生涯规划书
2014/02/10 职场文书
安卓程序员求职信
2014/02/28 职场文书
主管竞聘书范文
2014/03/31 职场文书
公司委托书范本
2014/04/04 职场文书
文明礼仪伴我行演讲稿
2014/05/12 职场文书
支行行长竞聘演讲稿
2014/05/15 职场文书
现场活动策划方案
2014/08/22 职场文书
个人作风纪律整顿整改措施
2014/10/25 职场文书
浅谈Python项目的服务器部署
2021/04/25 Python
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技