详解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 相关文章推荐
easy_install python包安装管理工具介绍
Feb 10 Python
使用Pyrex来扩展和加速Python程序的教程
Apr 13 Python
实践Vim配置python开发环境
Jul 02 Python
python 实现求解字符串集的最长公共前缀方法
Jul 20 Python
使用Python向DataFrame中指定位置添加一列或多列的方法
Jan 29 Python
python保存字典和读取字典的实例代码
Jul 07 Python
Django实现发送邮件功能
Jul 18 Python
python生成requirements.txt的两种方法
Sep 18 Python
解决Pycharm的项目目录突然消失的问题
Jan 20 Python
Django Model中字段(field)的各种选项说明
May 19 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
Jun 10 Python
pytorch实现查看当前学习率
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/07/17 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
2015/04/07 PHP
学习PHP的数组总结【经验】
2016/05/05 PHP
用jQuery打造TabPanel效果代码
2010/05/22 Javascript
jquery 弹出层注册页面等(asp.net后台)
2010/06/17 Javascript
$.ajax返回的JSON无法执行success的解决方法
2011/09/09 Javascript
IE中jquery.form中ajax提交没反应解决方法分享
2012/09/11 Javascript
js判断是否为ie的方法小结
2014/01/13 Javascript
JQuery实现table行折叠效果以JSON做数据源
2014/05/26 Javascript
$("").click与onclick的区别示例介绍
2014/09/25 Javascript
JavaScript动态修改弹出窗口大小的方法
2015/04/06 Javascript
jQuery实现垂直半透明手风琴特效代码分享
2015/08/21 Javascript
js文字横向滚动特效
2015/11/11 Javascript
jQuery simpleModal插件的使用介绍
2016/08/30 Javascript
用AngularJS的指令实现tabs切换效果
2016/08/31 Javascript
javascript观察者模式实现自动刷新效果
2017/09/05 Javascript
关于axios不能使用Vue.use()浅析
2018/01/12 Javascript
JS中Map和ForEach的区别
2018/02/05 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
Vue最新防抖方案(必看篇)
2019/10/30 Javascript
python中pycurl库的用法实例
2014/09/30 Python
python插入排序算法实例分析
2015/07/03 Python
Python实现八大排序算法
2016/08/13 Python
在NumPy中创建空数组/矩阵的方法
2018/06/15 Python
python代码 输入数字使其反向输出的方法
2018/12/22 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
Django和Flask框架优缺点对比
2019/10/24 Python
python装饰器练习题及答案
2019/11/01 Python
利用django创建一个简易的博客网站的示例
2020/09/29 Python
使用HTML5 Canvas绘制圆角矩形及相关的一些应用举例
2016/03/22 HTML / CSS
华为菲律宾官方网站:HUAWEI Philippines
2021/02/23 全球购物
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
总经理岗位职责描述
2014/02/08 职场文书
网吧温馨提示
2015/07/17 职场文书
MYSQL如何查看进程和kill进程
2022/03/13 MySQL