详解Django解决ajax跨域访问问题


Posted in Python onAugust 24, 2018

这篇文章主要给大家介绍了关于Django跨域请求问题解决的相关资料,文中介绍的实现方法包括:使用django-cors-headers全局控制、使用JsonP,只能用于Get方法以及在views.py里设置响应头,只能控制单个接口,需要的朋友可以参考下。
使用Django在服务器端写了一个API,返回一个JSON数据。使用Ajax调用该API:

但是,Chrome浏览器提示错误:

No 'Access-Control-Allow-Origin' header is present on the requested resource.

这是由于CORS导致的。

什么是CORS?

CORS(跨域资源共享,Cross-Origin Resource Sharing)是一种跨域访问的机制,可以让Ajax实现跨域访问。
其实,在服务器的response header中,加入“Access-Control-Allow-Origin: *”即可支持CORS,非常的简单,apache/nginx等怎么配置,见参考文档。
举个例子:

  1. API部署在DomainA上;
  2. Ajax文件部署在DomainB上,Ajax文件会向API发送请求,返回数据;
  3. 用户通过DomainC访问DomainB的Ajax文件,请求数据

详解Django解决ajax跨域访问问题

前端打开的是'http://localhost:63343‘地址, 另一个是django服务器,打开了‘http://localhost:8000‘地址, 所以在'http://localhost:63343‘的javascript对'http://localhost:8000‘进行访问时,端口不同,属于跨域访问.

当我将前端页面放入django中后,就不会出现跨域访问的拒绝了.

几种方法:

1.使用JSONP使用Ajax获取json数据时,存在跨域的限制。不过,在Web页面上调用js的script脚本文件时却不受跨域的影响,JSONP就是利用这个来实现跨域的传输。因此,我们需要将Ajax调用中的dataType从JSON改为JSONP(相应的API也需要支持JSONP)格式。
JSONP只能用于GET请求。

2.直接修改Django中的views.py文件修改views.py中对应API的实现函数,允许其他域通过Ajax请求数据:

def myview(_request): 
 response = HttpResponse(json.dumps({"key": "value", "key2": "value"}))
 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

3.安装django-cors-headers这里还有一各发现!在Django中,有人开发了CORS-header的middleware,只在settings.py中做一些简单的配置即可,开启CORS,没有跨域烦恼,真爽!~

django-cors-headers

首先安装

pip install django-cors-headers

然后在settings.py里配置一番就可以

INSTALLED_APPS = [ 
  ... 
  'corsheaders', 
  ... ] 
 MIDDLEWARE_CLASSES = ( 
  ... 
  'corsheaders.middleware.CorsMiddleware', 
  'django.middleware.common.CommonMiddleware', # 注意顺序 
  ... 
 ) 
#跨域增加忽略 
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = ( '*') 
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 相关文章推荐
python中map、any、all函数用法分析
Apr 21 Python
python实现统计代码行数的方法
May 22 Python
python 实时遍历日志文件
Apr 12 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
Jun 22 Python
Django开发中的日志输出的方法
Jul 02 Python
Django中日期处理注意事项与自定义时间格式转换详解
Aug 06 Python
浅谈python 读excel数值为浮点型的问题
Dec 25 Python
python3的数据类型及数据类型转换实例详解
Aug 20 Python
深入浅析Python 命令行模块 Click
Mar 11 Python
django实现将后台model对象转换成json对象并传递给前端jquery
Mar 16 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
Oct 15 Python
Python面向对象之内置函数相关知识总结
Jun 24 Python
Python面向对象之反射/自省机制实例分析
Aug 24 #Python
Python使用装饰器模拟用户登陆验证功能示例
Aug 24 #Python
Python日志模块logging基本用法分析
Aug 23 #Python
Python多继承原理与用法示例
Aug 23 #Python
Python抽象和自定义类定义与用法示例
Aug 23 #Python
Python引用计数操作示例
Aug 23 #Python
python实现括号匹配的思路详解
Aug 23 #Python
You might like
献给php初学者(入门学习经验谈)
2010/10/12 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
php 抽象类的简单应用
2011/09/06 PHP
php版微信公众平台开发之验证步骤实例详解
2016/09/23 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
2017/04/26 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
Laravel使用Queue队列的技巧汇总
2019/09/02 PHP
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
nodejs win7下安装方法
2012/05/24 NodeJs
javascript页面动态显示时间变化示例代码
2013/12/18 Javascript
javascript实现根据身份证号读取相关信息
2014/12/17 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
JQuery和PHP结合实现动态进度条上传显示
2016/11/23 Javascript
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
2017/06/20 Javascript
AnglarJs中的上拉加载实现代码
2018/02/08 Javascript
Angular5给组件本身的标签添加样式class的方法
2018/04/07 Javascript
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
2018/08/10 Javascript
vue自定义标签和单页面多路由的实现代码
2020/05/03 Javascript
node.js基础知识汇总
2020/08/25 Javascript
解决vue项目运行提示Warnings while compiling.警告的问题
2020/09/18 Javascript
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
Python性能优化技巧
2015/03/09 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
python列表每个元素同增同减和列表元素去空格的实例
2019/07/20 Python
新手学习Python2和Python3中print不同的用法
2020/06/09 Python
python中判断文件结束符的具体方法
2020/08/04 Python
解决Python3.8运行tornado项目报NotImplementedError错误
2020/09/02 Python
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
销售人员个人求职信
2013/09/26 职场文书
大学同学十年聚会感言
2014/02/21 职场文书
人事行政经理岗位职责
2014/06/18 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
学生违反校规检讨书
2014/10/28 职场文书
家长意见和建议怎么写
2015/06/04 职场文书
人民的好儿女观后感
2015/06/18 职场文书