Django跨域请求问题的解决方法示例


Posted in Python onJune 16, 2018

前言

本文主要给大家介绍了关于Django跨域请求问题解决的几种方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

几种方法:

  • 使用django-cors-headers全局控制
  • 使用JsonP,只能用于Get方法
  • 在views.py里设置响应头,只能控制单个接口

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',
)

大功告成了。

JsonP

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

JSONP只能用于GET请求。

什么是JSONP

首先提一下JSON这个概念,JSON是一种轻量级的数据传输格式,被广泛应用于当前Web应用中。JSON格式数据的编码和解析基本在所有主流语言中都被实现,所以现在大部分前后端分离的架构都以JSON格式进行数据的传输。

那么JSONP是什么呢?

首先抛出浏览器同源策略这个概念,为了保证用户访问的安全,现代浏览器使用了同源策略,即不允许访问非同源的页面,详细的概念大家可以自行百度。这里大家只要知道,在ajax中,不允许请求非同源的URL就可以了,比如www.a.com下的一个页面,其中的ajax请求是不允许访问www.b.com/c.php这样一个页面的。

JSONP就是用来解决跨域请求问题的,那么具体是怎么实现的呢?

JSONP原理

ajax请求受同源策略影响,不允许进行跨域请求,而script标签src属性中的链接却可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。

JSONP具体实现

127.0.0.1:8000中的index.html

<!DOCTYPE html>
<html>
<head>
<title>GoJSONP</title>
</head>
<body>
$(".jsonp_test").click(function () {
$.ajax({
url:"http://127.0.0.1:8008/service/",
type:"get",
dataType:"jsonp", // 伪造ajax 基于script
jsonp: 'callbacks',
//jsonpCallback:"alex",
success:function (data) {
console.log(data)
}
})
})
<button class='jsop_test'>测试</button>
</body> </html>

127.0.0.1:8080的views

import json
def jsonp_test(request):
func=request.GET.get("callbacks") #获取请求的callbacks参数
info={"name":"fuyong","age":18} #定义数据
return HttpResponse(" ('%s')"%(func,json.dumps(info))) #传json对象

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python开发简易版在线音乐播放器
Mar 03 Python
python文件名和文件路径操作实例
Sep 29 Python
Python简单实现的代理服务器端口映射功能示例
Apr 08 Python
Python返回数组/List长度的实例
Jun 23 Python
解决python3中cv2读取中文路径的问题
Dec 05 Python
python通过http下载文件的方法详解
Jul 26 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
Aug 15 Python
python安装virtualenv虚拟环境步骤图文详解
Sep 18 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
Nov 25 Python
python的faker库用法
Nov 28 Python
Python多线程Threading、子线程与守护线程实例详解
Mar 24 Python
python初步实现word2vec操作
Jun 09 Python
Python for循环生成列表的实例
Jun 15 #Python
Python把csv数据写入list和字典类型的变量脚本方法
Jun 15 #Python
Python对象属性自动更新操作示例
Jun 15 #Python
numpy使用fromstring创建矩阵的实例
Jun 15 #Python
详解Python 协程的详细用法使用和例子
Jun 15 #Python
在NumPy中创建空数组/矩阵的方法
Jun 15 #Python
numpy中矩阵合并的实例
Jun 15 #Python
You might like
在PHP中使用Sockets 从Usenet中获取文件
2008/01/10 PHP
php+mysqli数据库连接的两种方式
2015/01/28 PHP
PHP实现字符串大小写转函数的功能实例
2019/02/06 PHP
javascript JSON操作入门实例
2010/04/16 Javascript
javascript实现的DES加密示例
2013/10/30 Javascript
jQuery $命名冲突解决方案汇总
2014/11/13 Javascript
JavaScript中的console.assert()函数介绍
2014/12/29 Javascript
JavaScript获取各大浏览器信息图示
2015/11/20 Javascript
JQuery日历插件My97DatePicker日期范围限制
2016/01/20 Javascript
JS作为值的函数用法示例
2016/06/20 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
JS简单设置下拉选择框默认值的方法
2016/08/20 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
2016/11/30 Javascript
JS中SetTimeout和SetInterval使用初探
2017/03/23 Javascript
angular中ui calendar的一些使用心得(推荐)
2017/11/03 Javascript
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
解决vue 路由变化页面数据不刷新的问题
2018/03/13 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
Vue自定义弹窗指令的实现代码
2018/08/13 Javascript
VUE实现图片验证码功能
2020/11/18 Javascript
JS如何定义用字符串拼接的变量
2020/07/11 Javascript
js实现验证码功能
2020/07/24 Javascript
使用python BeautifulSoup库抓取58手机维修信息
2013/11/21 Python
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
python实现class对象转换成json/字典的方法
2016/03/11 Python
Python延时操作实现方法示例
2018/08/14 Python
python爬虫的一个常见简单js反爬详解
2019/07/09 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
广州盈通面试题
2015/12/05 面试题
人力资源管理专业毕业生推荐信
2013/11/07 职场文书
影视制作岗位职责
2013/12/04 职场文书
租房协议书样本
2014/08/20 职场文书
办公经费申请报告
2015/05/15 职场文书
奖学金发言稿(范文)
2019/08/21 职场文书
Java并发编程之详解CyclicBarrier线程同步
2021/06/23 Java/Android