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解决字典中的值是列表问题的方法
Mar 04 Python
详解Python的Twisted框架中reactor事件管理器的用法
May 25 Python
详解Python pygame安装过程笔记
Jun 05 Python
python读取文本中数据并转化为DataFrame的实例
Apr 10 Python
Python实现的括号匹配判断功能示例
Aug 25 Python
Python中fnmatch模块的使用详情
Nov 30 Python
python下载微信公众号相关文章
Feb 26 Python
Python 多个图同时在不同窗口显示的实现方法
Jul 07 Python
Python面向对象之继承原理与用法案例分析
Dec 31 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
Jan 17 Python
python 使用多线程创建一个Buffer缓存器的实现思路
Jul 02 Python
Python if else条件语句形式详解
Mar 24 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
桌面中心(一)创建数据库
2006/10/09 PHP
php 从数据库提取二进制图片的处理代码
2009/09/09 PHP
php根据日期判断星座的函数分享
2014/02/13 PHP
php数组中删除元素之重新索引的方法
2014/09/16 PHP
php分页函数完整实例代码
2014/09/22 PHP
php文件操作相关类实例
2015/06/18 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
2016/03/23 PHP
php源码 fsockopen获取网页内容实例详解
2016/09/24 PHP
PHP设计模式之委托模式定义与用法简单示例
2018/08/13 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
使用JS读秒使用示例
2013/09/21 Javascript
JavaScript函数定义的常见注意事项小结
2014/09/16 Javascript
javascript页面倒计时实例
2015/07/25 Javascript
详解Jquery的事件操作和文档操作
2016/12/19 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
2017/07/17 Javascript
学习Vue组件实例
2018/04/28 Javascript
angular 实现下拉列表组件的示例代码
2019/03/09 Javascript
a标签调用js的方法总结
2019/09/05 Javascript
使用typescript快速开发一个cli的实现示例
2020/12/09 Javascript
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
Python学习小技巧之列表项的拼接
2017/05/20 Python
Scrapy的简单使用教程
2017/10/24 Python
100行Python代码实现自动抢火车票(附源码)
2018/01/11 Python
FFT快速傅里叶变换的python实现过程解析
2019/10/21 Python
python程序如何进行保存
2020/07/03 Python
pandas apply使用多列计算生成新的列实现示例
2021/02/24 Python
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
澳大利亚优质的家居用品和生活方式公司:Bed Bath N’ Table
2019/04/16 全球购物
Charles&Keith美国官方网站:新加坡快时尚鞋类和配饰零售商
2019/11/27 全球购物
澳大利亚头发和美容产品购物网站:OZ Hair & Beauty
2020/03/27 全球购物
主持人演讲稿范文
2013/12/28 职场文书
应届毕业生如何写求职信
2014/02/16 职场文书
幼儿园优秀班主任事迹材料
2014/05/14 职场文书
Oracle表空间与权限的深入讲解
2021/11/17 Oracle
MySql重置root密码 --skip-grant-tables
2022/04/11 MySQL