详解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函数缺省值与引用学习笔记分享
Feb 10 Python
python共享引用(多个变量引用)示例代码
Dec 04 Python
python使用os模块的os.walk遍历文件夹示例
Jan 27 Python
在Django的上下文中设置变量的方法
Jul 20 Python
Python进行数据提取的方法总结
Aug 22 Python
python变量赋值方法(可变与不可变)
Jan 12 Python
从0开始的Python学习016异常
Apr 08 Python
python实现坦克大战游戏 附详细注释
Mar 27 Python
python Django里CSRF 对应策略详解
Aug 05 Python
pytorch:实现简单的GAN示例(MNIST数据集)
Jan 10 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
Nov 15 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
Feb 20 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实现链结人气统计
2006/10/09 PHP
ajax 的post方法实例(带循环)
2011/07/04 PHP
php中fsockopen用法实例
2015/01/05 PHP
PHP中如何防止外部恶意提交调用ajax接口
2016/04/11 PHP
Adnroid 微信内置浏览器清除缓存
2016/07/11 PHP
两种WEB下的模态对话框 (asp.net或js的分别实现)
2009/12/02 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
JavaScript中数组成员的添加、删除介绍
2014/12/30 Javascript
js打造数组转json函数
2015/01/14 Javascript
javascript数组排序汇总
2015/07/07 Javascript
动态加载jQuery的两种方法实例分析
2015/07/17 Javascript
javascript页面倒计时实例
2015/07/25 Javascript
100行代码理解和分析vue2.0响应式架构
2017/03/09 Javascript
Angular 2父子组件之间共享服务通信的实现
2017/07/04 Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
2017/09/20 jQuery
js 开发之autocomplete="off"在chrom中失效的解决办法
2017/09/28 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
axios异步提交表单数据的几种方法
2019/08/11 Javascript
layui table设置某一行的字体颜色方法
2019/09/05 Javascript
详解JavaScript 异步编程
2020/07/13 Javascript
JS+CSS实现动态时钟
2021/02/19 Javascript
[02:25]DOTA2英雄基础教程 生死判决瘟疫法师
2013/12/06 DOTA
Python中一些自然语言工具的使用的入门教程
2015/04/13 Python
Python用Bottle轻量级框架进行Web开发
2016/06/08 Python
使用python实现tcp自动重连
2017/07/02 Python
Python控制键盘鼠标pynput的详细用法
2019/01/28 Python
基于python的itchat库实现微信聊天机器人(推荐)
2019/10/29 Python
Python基础类继承重写实现原理解析
2020/04/03 Python
解决python执行较大excel文件openpyxl慢问题
2020/05/15 Python
Python实现简单猜数字游戏
2021/02/03 Python
怎样实现H5+CSS3手指滑动切换图片的示例代码
2019/05/05 HTML / CSS
HTML5公共页面提取作为公用代码的方法
2020/06/30 HTML / CSS
Nike法国官方网站:Nike.com FR
2018/07/22 全球购物
大专自我鉴定范文
2013/10/23 职场文书
税务干部个人整改措施思想汇报
2014/10/10 职场文书
运动会3000米加油稿
2015/07/21 职场文书