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中的yield浅析
Jun 16 Python
老生常谈Python进阶之装饰器
May 11 Python
Python数据结构之单链表详解
Sep 12 Python
Python设计模式之命令模式简单示例
Jan 10 Python
用tensorflow搭建CNN的方法
Mar 05 Python
python3 pygame实现接小球游戏
May 14 Python
对django的User模型和四种扩展/重写方法小结
Aug 17 Python
python 多进程并行编程 ProcessPoolExecutor的实现
Oct 11 Python
python 多维高斯分布数据生成方式
Dec 09 Python
tensorflow多维张量计算实例
Feb 11 Python
python3.4中清屏的处理方法
Jul 06 Python
python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码
Jan 06 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 图像函数大举例(非原创)
2009/06/20 PHP
用php实现的获取网页中的图片并保存到本地的代码
2010/01/05 PHP
php实现CSV文件导入和导出
2015/10/24 PHP
php网页版聊天软件实现代码
2016/08/12 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
解析John Resig Simple JavaScript Inheritance代码
2012/12/03 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
JavaScript中最简洁的编码html字符串的方法
2014/10/11 Javascript
jQuery中hasClass()方法用法实例
2015/01/06 Javascript
详解addEventListener的三个参数之useCapture
2015/03/16 Javascript
jquery实现根据浏览器窗口大小自动缩放图片的方法
2015/07/17 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
2016/05/28 Javascript
jQuery实现的放大镜效果示例
2016/09/13 Javascript
使用Ajax与服务器(JSON)通信实例
2016/11/04 Javascript
浅析JavaScript中break、continue和return的区别
2016/11/30 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
vue-lazyload使用总结(推荐)
2018/11/01 Javascript
NVM安装nodejs的方法实用步骤
2019/01/16 NodeJs
Vue.js实现的购物车功能详解
2019/01/27 Javascript
从理论角度讨论JavaScript闭包
2019/04/03 Javascript
[01:55]2014DOTA2国际邀请赛 BBC正赛第一天总结
2014/07/10 DOTA
谈谈如何手动释放Python的内存
2016/12/17 Python
Python数据类型之Number数字操作实例详解
2019/05/08 Python
将Python字符串生成PDF的实例代码详解
2019/05/17 Python
django搭建项目配置环境和创建表过程详解
2019/07/22 Python
Python requests获取网页常用方法解析
2020/02/20 Python
欧舒丹加拿大官网:L’Occitane加拿大
2017/10/29 全球购物
美国著名的家居用品购物网站:Bed Bath & Beyond
2018/01/05 全球购物
环境工程与管理大学毕业生求职信
2013/10/02 职场文书
职业技术学校毕业生推荐信
2013/12/03 职场文书
家具促销活动方案
2014/02/16 职场文书
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
解决Redis启动警告问题
2022/02/24 Redis