django处理跨域
django处理Ajax跨域访问时使用javascript进行ajax访问的时候,出现如下错误
出错原因:javascript处于安全考虑,不允许跨域访问。下图是对跨域访问的解释:
概念:
这里说的js跨域是指通过js或python在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(Django)的数据。只要协议、域名、端口有任何一个不同,都被当作是不同的域。
跨域,简单来说就是 A 网站的 javascript 代码试图访问 B 网站,包括提交内容和获取内容。这显然是不安全的。为此,浏览器的鼻祖:网景(Netscape)公司提出了优秀的解决方案:著名的浏览器同源策略。现在所有支持JavaScript的浏览器都会使用这个策略。
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略,它是由Netscape提出的一个著名的安全策略。
解决办法
1. 修改views.py文件
修改views.py中对应API的实现函数,允许其他域通过Ajax请求数据:
todo_list = [
{"id": "1", "content": "吃饭"},
{"id": "2", "content": "吃饭"},
] class Query(View):
@staticmethod
def get(request):
response = JsonResponse(todo_list, safe=False)
response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Methods"] = "POST, GET, OPTIONS"
response["Access-Control-Max-Age"] = "1000"
response["Access-Control-Allow-Headers"] = "*"
return response @staticmethod
def post(request):
print(request.POST)
return HttpResponse()
- 简单请求 OR 非简单请求 
 条件:
 1、请求方式:HEAD、GET、POST
 2、请求头信息:
 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="PUT"
 如果复杂请求设置了请求头,则服务端需要设置允许某请求头,否则“预检”不通过
 Access-Control-Request-Headers="k1"
- 基于cors实现的ajax请求: - 1、支持跨域的简单请求 - 服务器设置响应头:Access-Control-Allow-Origin = '指定域名' - 服务器设置响应头:Access-Control-Allow-Origin = '*' # *:表示允许所有的请求 - 2、复杂请求的请求头: - 由于复杂请求时,首先会发送“预检”请求,如果“预检”成功,则发送真实数据。 # 预检时可以发送空数据 - “预检”请求时,允许请求方式则需服务器设置响应头:Access-Control-Request-Method="PUT" # 或其他复杂请求如DELETE - “预检”请求时,允许请求头则需服务器设置响应头:Access-Control-Request-Headers="k1" # ajax的header:{"k1":"v1"} - “预检”缓存时间,服务器设置响应头:Access-Control-Max-Age=10 # 十秒内此请求再有请求过来时无需再发送options预检,直接发送复杂请求,减轻服务器压力 - 3、跨域获取响应头 - 默认获取到的所有响应头只有基本信息,如果想要获取自定义的响应头,则需要再服务器端设置Access-Control-Expose-Headers。 - 4、跨域传输cookie - 在跨域请求中,默认情况下,HTTP Authentication信息,Cookie头以及用户的SSL证书无论在预检请求中或是在实际请求都是不会被发送。 - 如果想要发送: - 浏览器端:XMLHttpRequest的withCredentials为true - 服务器端:Access-Control-Allow-Credentials为true - 注意:服务器端响应的 Access-Control-Allow-Origin 不能是通配符 
2. 添加中间件 django-cors-headers
GitHub地址: https://github.com/ottoyiu/django-cors-headers
2.1. 安装
pip install django-cors-headers
2.2 添加app
INSTALLED_APPS = (
...
'corsheaders',
...
)
2.3 添加中间件
MIDDLEWARE = [ # Or MIDDLEWARE_CLASSES on Django < 1.10
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
2.4 配置允许跨站访问本站的地址
CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = (
'localhost:63343',
)
# 默认值是全部:
CORS_ORIGIN_WHITELIST = () # 或者定义允许的匹配路径正则表达式.
CORS_ORIGIN_REGEX_WHITELIST = ('^(https?://)?(\w+.)?>google.com$', ) # 默认值:
CORS_ORIGIN_REGEX_WHITELIST = ()
2.5 设置允许访问的方法
CORS_ALLOW_METHODS = (
'GET',
'POST',
'PUT',
'PATCH',
'DELETE',
'OPTIONS'
)
2.6 设置允许的header:
默认值:
CORS_ALLOW_HEADERS = (
'x-requested-with',
'content-type',
'accept',
'origin',
'authorization',
'x-csrftoken'
)
django处理跨域的更多相关文章
- django允许跨域请求配置
		django允许跨域请求配置 下载corsheader pip install django-cors-headers 修改setting.py中配置 在INSTALLED_APPS中增加corshe ... 
- Django 处理跨域的配置、前台处理ajax
		一. Django处理跨域 跨域的处理方式有很多,使用最多的就是CORS(跨域资源共享),接下来大致提一下django中处理跨域的配置. 首先安装django-cors-headers模块: pip ... 
- Django cors跨域问题
		Django cors跨域问题 前后端分离项目中的跨域问题 即同源策略 同源策略:同源策略/SOP(Same origin policy)是一种约定,由 Netscape 公司 1995 年引入浏览器 ... 
- tornado django flask  跨域解决办法(cors)
		XMLHttpRequest cannot load http://www.baidu.com. No 'Access-Control-Allow-Origin' header is present ... 
- django解决跨域请求的问题
		跨域请求可以用jsonp来解决,不过今天我发现一个很好用的包:django-cors-headers 只需要简单地配置一下就可 被请求方的setting.py中的配置如下: INSTALLED_APP ... 
- Django解决跨域问题
		原理:浏览器的同源策略,其实我们的请求发送过去了,服务器也进行响应了,就是浏览器把响应给阻止响应而已 第一种方法jsonp 因为浏览器不对 <script> 标签里面的src属性进行阻止, ... 
- Python  django解决跨域请求的问题
		解决方案 1.安装django-cors-headers pip3 install django-cors-headers 2.配置settings.py文件 INSTALLED_APPS = [ . ... 
- django restframework 跨域访问
		场景介绍: 在Django开发过程中,使用前后端分离设计的站点越来越多,如Django+VUE.Django+Angular.在使用DjangoRestFramework开发API的过程中,由于前端站 ... 
- django - 总结 - 跨域请求
		script ->jsonp跨域 浏览器的同源策略:不能跨越网站请求信息: XMLHttpRequests遵循这个规定. 因此ajax等基于XML的都不能进行跨站请求 而我们知道img,ifra ... 
- drf版本控制 和django缓存,跨域问题,
		drf版本控制 基于url的get传参方式 REST_FRAMEWORK={ # "DEFAULT_AUTHENTICATION_CLASSES":["app01.aut ... 
随机推荐
- MySQL中 BETWEEN ... AND ...
			MySQL中 BETWEEN ... AND ... 1. 准备测试数据 CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, ... 
- VScode git无法使用,Error: command 'git.push' not found 源代码管理无法使用的问题及解决方法
			正常条件下,只要电脑中安装了Git,VScode就可以直接使用. 在开始界面有下图所示的功能: 在源代码管理栏目中: 如果没能正常工作,就看不到这些功能. 可能在用某些与git相关的功能时,如安装了G ... 
- 详解 Apache SkyWalking OAP 的分布式计算
			SkyWalking的OAP(Observability Analysis Platform,观测分析平台)是一个用于链路数据的分布式计算系统. 因为它巧妙的设计,使得在链路数据计算和聚合过程中,不需 ... 
- .NET 云原生架构师训练营(权限系统 系统演示 ActionAccess)--学习笔记
			目录 模块拆分 环境配置 默认用户 ActionAccess 模块拆分 环境配置 mysql migration mysql docker pull mysql docker run -p 3306: ... 
- 02.Oracle之安装与配置
			1.Oracle简介 Oracle是世界上最早的商品化的关系型数据库管理系统,是数据库专业厂商ORACLE(中文名字叫甲骨文)公司开发的,也是当前应用最为广泛.功能最强大.具有面向对象特点.采用了客户 ... 
- 『德不孤』Pytest框架 — 4、Pytest跳过测试用例
			目录 1.无条件跳过skip 2.有条件跳过skipif 3.练习 自动化测试执行过程中,我们常常出现这种情况:因为功能阻塞,未实现或者环境有问题等等原因,一些用例执行不了, 如果我们注释掉或删除掉这 ... 
- 认识 LLVM
			简介 LLVM是一套提供编译器基础设施的开源项目,是用 C++ 编写,包含一系列模块化的编译器组件和工具链,用来开发编译器前端和后端.它是为了任意一种编程语言而写成的程序,利用虚拟技术创造出编译时期. ... 
- 为什么我建议在复杂但是性能关键的表上所有查询都加上 force index
			最近,又遇到了慢 SQL,简单的看了下,又是因为 MySQL 本身优化器还有查询计划估计不准的问题.SQL 如下: select * from t_pay_record WHERE (( user_i ... 
- [题解]第十一届北航程序设计竞赛预赛——D.最大公约数
			题目描述 给一个长度为n(1<=n<=100000)的正整数列,分成尽量多的非空段,使得每一段的最大公约数相等.一个数的最大公约数是它本身. 解题思路 要求每一段子列的gcd相等,不妨设为 ... 
- 商业智能BI工具为什么这么火?
			近年来,随着大数据.数据分析技术的兴起,商业智能BI工具应运而生,其中BI工具已成为众多企业商务决策的重要工具.也许有人会问,为什么企业需要商业智能BI工具?商业智能BI工具可以为企业带来什么? 首 ... 
