django基于cors解决跨域请求问题详解

 更新时间:2019年08月06日 14:40:45   作者:Maple_feng  
这篇文章主要介绍了django基于cors解决跨域请求问题详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一 同源策略

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

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

比如:我在本地上的域名是127.0.0.1:8000,请求另外一个域名:127.0.0.1:8001一段数据

浏览器上就会报错,这个就是同源策略的保护,如果浏览器对javascript没有同源策略的保护,那么一些重要的机密网站将会很危险

已拦截跨源请求:同源策略禁止读取位于 http://127.0.0.1:8001/SendAjax/ 的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin')。

但是注意,项目2中的访问已经发生了,说明是浏览器对非同源请求返回的结果做了拦截

二 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)请求方法是以下三种方法之一:

  • HEAD
  • GET
  • POST

(2)HTTP的头信息不超出以下几种字段:

  • Accept
  • Accept-Language
  • Content-Language
  • Last-Event-ID
  • Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

凡是不同时满足上面两个条件,就属于非简单请求。

浏览器对这两种请求的处理,是不一样的。

* 简单请求和非简单请求的区别?

 简单请求:一次请求
 非简单请求:两次请求,在发送数据之前会先发一次请求用于做“预检”,只有“预检”通过后才再发送一次请求用于数据传输。
* 关于“预检”

- 请求方式:OPTIONS
- “预检”其实做检查,检查如果通过则允许传输数据,检查不通过则不再发送真正想要发送的消息
- 如何“预检”
  => 如果复杂请求是PUT等请求,则服务端需要设置允许某请求,否则“预检”不通过
  Access-Control-Request-Method
  => 如果复杂请求设置了请求头,则服务端需要设置允许某请求头,否则“预检”不通过
  Access-Control-Request-Headers

支持跨域,简单请求

服务器设置响应头:Access-Control-Allow-Origin = '域名' 或 '*'

支持跨域,复杂请求

由于复杂请求时,首先会发送“预检”请求,如果“预检”成功,则发送真实数据。

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

五 Django项目中支持CORS

在返回的结果中加入允许信息(简单请求)

def test(request):
 import json
 obj=HttpResponse(json.dumps({'name':'lqz'}))
 # obj['Access-Control-Allow-Origin']='*'
 obj['Access-Control-Allow-Origin']='http://127.0.0.1:8004'
 return obj

放到中间件处理复杂和简单请求:

from django.utils.deprecation import MiddlewareMixin
class CorsMiddleWare(MiddlewareMixin):
 def process_response(self,request,response):
  if request.method=="OPTIONS":
   #可以加*
   response["Access-Control-Allow-Headers"]="Content-Type"
  response["Access-Control-Allow-Origin"] = "http://localhost:8080"
  return response

六 利用django-cors-headers模块处理

1.安装cors模块

pip install django-cors-headers

2.修改setting.py中配置

INSTALLED_APPS = [
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles', 
 'corsheaders',
]
MIDDLEWARE_CLASSES = [
 'django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware', 
 'corsheaders.middleware.CorsMiddleware', 
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

3.添加允许访问的白名单,凡是出现在白名单的域名都可以访问后端接口

CORS_ORIGIN_WHITELIST = (
 '127.0.0.1:8080',
 'localhost:8080',
)
CORS_ALLOW_CREDENTIALS = True # 指明在跨域访问中,后端是否支持对cookie的操作。
CORS_ALLOW_METHODS = (
 'DELETE',
 'GET',
 'OPTIONS',
 'PATCH',
 'POST',
 'PUT',
 'VIEW',
)
CORS_ALLOW_HEADERS = (
 'XMLHttpRequest',
 'X_FILENAME',
 'accept-encoding',
 'authorization',
 'content-type',
 'dnt',
 'origin',
 'user-agent',
 'x-csrftoken',
 'x-requested-with',
 'Pragma',
)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Python enumerate内置库用法解析

    Python enumerate内置库用法解析

    这篇文章主要介绍了Python enumerate内置库用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Ranorex通过Python将报告发送到邮箱的方法

    Ranorex通过Python将报告发送到邮箱的方法

    这篇文章主要介绍了Ranorex通过Python将报告发送到邮箱的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • python高手之路python处理excel文件(方法汇总)

    python高手之路python处理excel文件(方法汇总)

    用python来自动生成excel数据文件。python处理excel文件主要是第三方模块库xlrd、xlwt、xluntils和pyExcelerator,除此之外,python处理excel还可以用win32com和openpyxl模块
    2016-01-01
  • Python数据处理之临近匹配的实现详解

    Python数据处理之临近匹配的实现详解

    在数据处理中,经常需要找到最接近给定值的元素或数据点,这种需求在科学、工程和统计分析中非常常见,Python 提供了多种方法来实现这种临近匹配,下面就跟随小编一起学习一下吧
    2024-02-02
  • Python中字典的基础介绍及常用操作总结

    Python中字典的基础介绍及常用操作总结

    字典也是python的数据类型中的一种,它由许多键值对组成,它是一种可变容器模型,一般情况下键是唯一的,字典支持嵌套,下面这篇文章主要给大家介绍了关于Python中字典的基础介绍及常用操作,需要的朋友可以参考下
    2021-09-09
  • python-leetcode求区间[M,N]内的所有素数的个数实现方式

    python-leetcode求区间[M,N]内的所有素数的个数实现方式

    这篇文章主要介绍了python-leetcode求区间[M,N]内的所有素数的个数实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Python 内置函数globals()和locals()对比详解

    Python 内置函数globals()和locals()对比详解

    这篇文章主要介绍了Python globals()和locals()对比详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 浅谈Python实现Apriori算法介绍

    浅谈Python实现Apriori算法介绍

    这篇文章主要介绍了浅谈Python实现Apriori算法介绍,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • 跟老齐学Python之一个免费的实验室

    跟老齐学Python之一个免费的实验室

    学习Python也要做实验,也就是尝试性地看看某个命令到底什么含义。在《集成开发环境(IDE)》一章中,我们介绍了Python的IDE时,给大家推荐了IDLE,进入到IDLE中,看到>>>符号,可以在后面输入一行指令。其实,这就是一个非常好的实验室。
    2014-09-09
  • python中的闭包和装饰器的使用示例

    python中的闭包和装饰器的使用示例

    闭包就是能够读取其他函数内部变量的函数,例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数,这篇文章主要介绍了python中的闭包和装饰器的使用,需要的朋友可以参考下
    2022-11-11

最新评论