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 面向对象 成员的访问约束
Dec 23 Python
Python的字典和列表的使用中一些需要注意的地方
Apr 24 Python
Python3实现从文件中读取指定行的方法
May 22 Python
Python中urllib+urllib2+cookielib模块编写爬虫实战
Jan 20 Python
Python进程间通信Queue实例解析
Jan 25 Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 Python
python可视化实现代码
Jan 15 Python
Python3内置模块pprint让打印比print更美观详解
Jun 02 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
Jun 03 Python
Python log模块logging记录打印用法解析
Jan 20 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
Sep 09 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
Nov 30 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实现多服务器共享SESSION数据的方法
2007/03/16 PHP
非常重要的php正则表达式详解
2016/01/04 PHP
javascript 实现父窗口引用弹出窗口的值的脚本
2007/08/07 Javascript
JQuery打造PHP的AJAX表单提交实例
2009/11/03 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
网页收藏夹显示ICO图标(代码少)
2015/08/04 Javascript
jQuery删除节点用法示例(remove方法)
2016/09/08 Javascript
详解Bootstrap各式各样的按钮(推荐)
2016/12/13 Javascript
jquery使用EasyUI Tree异步加载JSON数据(生成树)
2017/02/11 Javascript
layui表格实现代码
2017/05/20 Javascript
Angular 4依赖注入学习教程之简介(一)
2017/06/04 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
2017/08/14 jQuery
10行原生JS实现文字无缝滚动(超简单)
2018/01/02 Javascript
webstorm中vue语法的支持详解
2018/05/09 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
Angular resolve基础用法详解
2018/10/03 Javascript
vue router 组件的高级应用实例代码
2019/04/08 Javascript
jQuery-Citys省市区三级菜单联动插件使用详解
2019/07/26 jQuery
js中关于Blob对象的介绍与使用
2019/11/29 Javascript
netbeans7安装python插件的方法图解
2013/12/24 Python
用Python实现一个简单的多线程TCP服务器的教程
2015/05/05 Python
jupyter安装小结
2016/03/13 Python
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
python opencv旋转图像(保持图像不被裁减)
2018/07/26 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
python队列原理及实现方法示例
2019/11/27 Python
python 实现让字典的value 成为列表
2019/12/16 Python
python实现二分查找算法
2020/09/18 Python
基于PyTorch中view的用法说明
2021/03/03 Python
英国领先的餐饮折扣俱乐部:Gourmet Society
2020/07/26 全球购物
致跳远运动员广播稿
2014/02/11 职场文书
担保书格式
2015/01/20 职场文书
单位接收证明格式
2015/06/18 职场文书
Javascript之datagrid查询详解
2021/09/15 Javascript
mysql函数全面总结
2021/11/11 MySQL
Android Gradle 插件自定义Plugin实现注意事项
2022/06/16 Java/Android