django-restframework 处理跨域问题

一 前言

想要处理跨域问题,首先需要了解同源策略。

二 同源策略

同源策略(Same origin policy)是一种约定,它是浏览器最核心也是最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说 Web 是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

请求的 url 地址,必须与浏览器上的 url 地址处在同域上,也就是域名、端口、协议相同。

三 CORS 简介

CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。

整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。

因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

四 CORS 基本流程

浏览器将CORS请求分成两类:简单请求(simple request)非简单请求(not-so-simple request)。

浏览器发出CORS简单请求只需要在头信息之中增加一个Origin字段。

浏览器发出CORS非简单请求会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。

五 CORS 两种请求详解

浏览器发出的请求可以分为简单请求和非简单请求。

一 简单请求

  1. 1) 请求方法是以下三种方法之一:
  2. HEAD
  3. GET
  4. POST
  5. 2HTTP的头信息不超出以下几种字段:
  6. Accept
  7. Accept-Language
  8. Content-Language
  9. Last-Event-ID
  10. Content-Type:只限于三个值application/x-www-form-urlencodedmultipart/form-datatext/plain

二 非简单请求

凡是不同时满足上面两个条件,就属于非简单请求。浏览器对这两种请求的处理是不一样的。

三 简单请求和非简单请求的区别

  1. * 简单请求和非简单请求的区别?
  2. 简单请求:一次请求
  3. 非简单请求:两次请求,在发送数据之前会先发一次请求用于做“预检”,只有“预检”通过后才再发送一次请求用于数据传输。
  4. * 关于“预检”
  5. - 请求方式:OPTIONS
  6. - “预检”其实做检查,检查如果通过则允许传输数据,检查不通过则不再发送真正想要发送的消息
  7. - 如何“预检”
  8. => 如果复杂请求是PUT等请求,则服务端需要设置允许某请求,否则“预检”不通过
  9. Access-Control-Request-Method
  10. => 如果复杂请求设置了请求头,则服务端需要设置允许某请求头,否则“预检”不通过
  11. Access-Control-Request-Headers

六 两种请求支持跨域

一 简单请求支持跨域

服务器只需要设置响应头为:

  1. Access-Control-Allow-Origin = '域名' '*'

二 非简单请求支持跨域

由于复杂请求时,首先会发送‘’预检‘’请求,如果预检成功,则发送真实请求。

  • ‘’预检‘’请求时,允许请求方式需要服务器设置响应头:Access-Control-Request-Method
  • ‘’预检‘’请求时,允许请求头则需要服务器设置响应头:Access-Control-Request-Headers

七 django 中实现跨域

因为每个请求都需要进行判断是否允许,所以在中间件中处理跨域。

settings.py

  1. # settings.py
  2. # 设置了一个 ip 访问白名单
  3. WHITE_MENU = [
  4. '127.0.0.1',
  5. ]
  6. # 配置中间件,最后一个
  7. MIDDLEWARE = [
  8. 'django.middleware.security.SecurityMiddleware',
  9. 'django.contrib.sessions.middleware.SessionMiddleware',
  10. 'django.middleware.common.CommonMiddleware',
  11. 'django.middleware.csrf.CsrfViewMiddleware',
  12. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  13. 'django.contrib.messages.middleware.MessageMiddleware',
  14. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  15. 'app01.mid.CORS',
  16. ]

mid.py

  1. from django.utils.deprecation import MiddlewareMixin
  2. from DRESF_03 import settings
  3. class CORS(MiddlewareMixin):
  4. def process_response(self, request, response):
  5. ip_list = settings.WHITE_MENU
  6. if request.META.get('REMOTE_ADDR') in ip_list:
  7. response['Access-Control-Allow-Origin'] = request.META.get('HTTP_ORIGIN')
  8. # response['Access-Control-Allow-Origin'] = 'http://127.0.0.1'
  9. print('2345')
  10. if request.method == 'OPTIONS':
  11. response['Access-Control-Allow-Methods'] = 'PUT,DELETE'
  12. response['Access-Control-Allow-Headers'] = 'Content-Type'
  13. print('34567')
  14. print('request', request.META)
  15. print('response', response)
  16. return response

django-restframework 处理跨域问题的更多相关文章

  1. django 前端请求跨域问题解决

    django 前端请求跨域问题解决 笔者之前在做django-restful-api开发的时候,在前端请求页面发送请求的时候直接出现301,域名重定向的问题,经过一番查阅资料,终于得到了非常完美的解决 ...

  2. Django框架 之 跨域请求伪造

    Django框架 之 跨域请求伪造 浏览目录 同源策略与Jsonp 同源策略 Jsonp jQuery对JSONP的实现 CORS 简介 两种请求 同源策略与Jsonp 同源策略 同源策略(Same ...

  3. 跨域问题和django中实现跨域

    跨域问题 1.同源策略(浏览器的安全功能): 请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同 2.CORS跨域资源共享 实现CORS通信的关键是服务器,只要服务器实 ...

  4. django 12天(跨域,文件上传,下载,cookie,session)

    django 12天(跨域,文件上传,下载) 跨域 什么是跨域 1.协议不同 2.端口不同 3.主机不同 如何解决跨域 1.安装django-cors-headers模块 2.在settings.py ...

  5. django中解决跨域问题

    -跨域问题 -浏览器的:同源策略,浏览器拒绝不是当前域域返回的数据 -ip地址和端口号都相同才是同一个域 -如何解决: -CORS:跨域资源共享 -简单请求:发一次请求 -非简单请求:非简单请求是发送 ...

  6. 在django中解决跨域AJAX

    由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取另一个源加载的文档的属性. 特别的:由于同源策略是浏览器的限制,所以请求的发送和响应是可以进行,只不过浏览器不接收罢了. 浏览器同源 ...

  7. 解决Django本地接口不能跨域访问的问题

    1.安装django-cors-headers模块: pip install django-cors-headers 2.插入Django的APP配置中: # 修改settings.py中的INSTA ...

  8. DJANGO的API跨域实现

    Ajax跨域请求报错:XMLHttpRequest cannot load ''. No 'Access-Control-Allow-Origin' header is present on the ...

  9. 版本控制,django缓存,跨域问题解决

    复习 分页: 1. 简单分页 2. 偏移分页 3. 加密分页 解析器:客户处理前端提交来的数据 urlencode: body体中的数据格式: key=value& formdata编码:为区 ...

  10. django实现api跨域请求访问

    第一步:安装 django-cors-headers pip install django-cors-headers 第二步:配置settings.py文件 --------------------- ...

随机推荐

  1. Raft算法

    http://www.cnblogs.com/mindwind/p/5231986.html

  2. linux系统光盘开机自动挂载-配置本地yum源

    一.光盘开机自动挂载 1.修改配置文件 执行命令 :vi /etc/fstab  添加/dev/cdrom                   /mnt           iso9660      ...

  3. TCP报文解析

    概述 在<网络基础总结(一)>总结了TCP建立连接和断开连接的流程,然而TCP协议远比我所了解的复杂得多,我所知的可以说就冰山一角,所总结的也只是纸上谈兵,仅仅只能对TCP有个肤浅的认识, ...

  4. 阿里云ECS安装Cadvisor报错

    阿里云ECS安装Cadvisor报错安装命令: sudo docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ -- ...

  5. 『简单积性函数和dirichlet卷积』

    简单积性函数 在学习欧拉函数的时候,相信读者对积性函数的概念已经有了一定的了解.接下来,我们将相信介绍几种简单的积性函数,以备\(dirichlet\)卷积的运用. 定义 数论函数:在数论上,对于定义 ...

  6. Dubbo Mesh 在闲鱼生产环境中的落地实践

    本文作者至简曾在 2018 QCon 上海站以<Service Mesh 的本质.价值和应用探索>为题做了一次分享,其中谈到了 Dubbo Mesh 的整体发展思路是“借力开源.反哺开源” ...

  7. 在已有的Asp.net MVC项目中引入Taurus.MVC

    Taurus.MVC是一个优秀的框架,如果要应用到已有的Asp.net MVC项目中,需要修改一下. 1.前提约定: 走Taurus.MVC必须指定后缀.如.api 2.原项目修改如下: web.co ...

  8. Oracle数据库常用SQL函数

    1.SQL函数的概念: 函数一般是在数据上执行的,它给数据的转换和处理提供了方便.只是将取出的数据进行处理,不会改变数据库中的值.(类似于java中的方法但函数只是将数据库中的数据取出(复制)到函数中 ...

  9. SpringIOC原理简述

    IOC:控制反转(Inversion of Control,英文缩写为 IOC) 简单来讲就是把代码的控制权从调用方(用户)转变成被调用方(服务端) 以前的代码控制权在调用方,所以要每当程序要更新修改 ...

  10. android消息处理源码分析

    一.简介消息处理机制主要涉及到这几个类:1.Looper2.MessageQueue3.Message4.Handler 二.源码分析 Looper.class的关键源码: //保存Looper对象, ...