详解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引用(import)文件夹下的py文件的方法
Aug 26 Python
python使用BeautifulSoup分析网页信息的方法
Apr 04 Python
Python基于PycURL自动处理cookie的方法
Jul 25 Python
python从入门到精通(DAY 1)
Dec 20 Python
python逆向入门教程
Jan 15 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
Jun 19 Python
python爬虫 urllib模块发起post请求过程解析
Aug 20 Python
Python列表元素常见操作简单示例
Oct 25 Python
python解析命令行参数的三种方法详解
Nov 29 Python
keras的load_model实现加载含有参数的自定义模型
Jun 22 Python
python怎么自定义捕获错误
Jun 29 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
Sep 09 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
关于时间计算的结总
2006/12/06 PHP
PHP截取IE浏览器并缩小原图的方法
2016/03/04 PHP
关于PHP内置的字符串处理函数详解
2017/02/04 PHP
javascript 数组学习资料收集
2010/04/11 Javascript
从零开始学习jQuery (六) jquery中的AJAX使用
2011/02/23 Javascript
js控制CSS样式属性语法对照表
2012/12/11 Javascript
深入理解JavaScript系列(30):设计模式之外观模式详解
2015/03/03 Javascript
jQuery实现带动画效果的二级下拉导航方法
2015/03/11 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
JavaScript实现图片无缝滚动效果
2017/07/07 Javascript
Vue实现购物车场景下的应用
2017/11/27 Javascript
浅谈Vue内置component组件的应用场景
2018/03/27 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
详解webpack loader和plugin编写
2018/10/12 Javascript
React精髓!一篇全概括小结(急速)
2019/05/23 Javascript
使用VScode 插件debugger for chrome 调试react源码的方法
2019/09/13 Javascript
用Nodejs实现在终端中炒股的实现
2020/10/18 NodeJs
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
[41:56]Spirit vs Liquid Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
python循环监控远程端口的方法
2015/03/14 Python
在Python中使用第三方模块的教程
2015/04/27 Python
python对excel文档去重及求和的实例
2018/04/18 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
对python特殊函数 __call__()的使用详解
2019/07/02 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
2020/06/04 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
使用css如何制作时间ICON方法实践
2012/11/12 HTML / CSS
Kathmandu美国网站:新西兰户外运动品牌
2019/03/23 全球购物
计算机工程学院个人求职信
2013/10/05 职场文书
大学生社团活动总结
2014/04/26 职场文书
项目经理助理岗位职责
2015/04/13 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
离职告别感言
2015/08/04 职场文书
python中pandas.read_csv()函数的深入讲解
2021/03/29 Python
css position fixed 左右双定位的实现代码
2021/04/29 HTML / CSS