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 27 Python
python定时器(Timer)用法简单实例
Jun 04 Python
在Django的视图(View)外使用Session的方法
Jul 23 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
Aug 10 Python
你真的了解Python的random模块吗?
Dec 12 Python
Python实现微信消息防撤回功能的实例代码
Apr 29 Python
python处理大日志文件
Jul 23 Python
基于python二叉树的构造和打印例子
Aug 09 Python
redis数据库及与python交互用法简单示例
Nov 01 Python
Python Http请求json解析库用法解析
Nov 28 Python
python绘图pyecharts+pandas的使用详解
Dec 13 Python
python小型的音频操作库mp3Play
Apr 24 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
微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
2014/10/21 PHP
PHP中的Iterator迭代对象属性详解
2019/04/12 PHP
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
niceTitle 基于jquery的超链接提示插件
2010/05/31 Javascript
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
js函数在frame中的相互调用详解
2014/03/03 Javascript
用json方式实现在 js 中建立一个map
2014/05/02 Javascript
js获取下拉列表的值和元素个数示例
2014/05/07 Javascript
Angular Js文件上传之form-data
2015/08/28 Javascript
javascript中Date format(js日期格式化)方法小结
2015/12/17 Javascript
浅析Javascript匿名函数与自执行函数
2016/02/06 Javascript
省市区三级联动jquery实现代码
2020/04/15 Javascript
js 倒计时(高效率服务器时间同步)
2017/09/12 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
vue组件中的数据传递方法
2018/05/14 Javascript
微信小程序项目实践之九宫格实现及item跳转功能
2018/07/19 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
2019/05/12 Javascript
基于VUE的v-charts的曲线显示功能
2019/10/01 Javascript
基于PHP pthreads实现多线程代码实例
2020/06/24 Javascript
[05:05]第三天的dota2
2013/07/29 DOTA
[13:16]INFAMOUS vs VGJ T BO3
2018/06/07 DOTA
python 获取当天凌晨零点的时间戳方法
2018/05/22 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
2018/05/25 Python
python计算两个地址之间的距离方法
2018/06/09 Python
利用Python读取txt文档的方法讲解
2018/06/23 Python
python实现俄罗斯方块
2018/06/26 Python
利用Python模拟登录pastebin.com的实现方法
2019/07/12 Python
Python中的单下划线和双下划线使用场景详解
2019/09/09 Python
python 识别登录验证码图片功能的实现代码(完整代码)
2020/07/03 Python
pycharm 添加解释器的方法步骤
2020/08/31 Python
YOOX美国官方网站:全球著名的多品牌时尚网络概念店
2016/09/11 全球购物
天网面试题
2013/04/07 面试题
IBatis持久层技术
2016/07/18 面试题
2014年医院个人工作总结
2014/12/09 职场文书
python使用torch随机初始化参数
2022/03/22 Python