我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Django—跨域请求(jsonp)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Django—跨域请求(jsonp)

同源策略

如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源。

 

示例:两个Django demo

demo1

url.py

url(r'^demo1/',demo1),

view.py

def demo1(request):
    return HttpResponse("demo1")

 

demo2

url.py

url(r'demo2$',demo2),

view.py

def demo2(request):
    return render(request,'demo.html')

demo.html

<body>
<button id="btn">点击</button>

<script>
    $("#btn").click(function () {
        $.ajax({
            url:"http://127.0.0.1:8002/demo1/",
            type:"get",
        }).done(function (data) {
            console.log(data)
        })
    });
</script>
</body>
View Code

启动浏览器,访问http://127.0.0.1:8001/demo2,点击按钮,然后控制台报错

为什么报错?因为同源策略限制跨域发送ajax请求。

我们用script标签引入cdn没有报错,so,用script解决问题试试。

修改demo.html

<body>
<button id="btn">点击</button>

<script class="lazy" data-src="http://127.0.0.1:8002/demo1"></script>

</body>
View Code

刷新浏览器

说demo1未定义,那定义一个demo1;修改demo.html

<body>
<button id="btn">点击</button>

<script>
var demo1 = "demo1"
</script>
<script class="lazy" data-src="http://127.0.0.1:8002/demo1/"></script>


</script>
</body>
View Code

 然后不报错了。

 那在定义一个demo1函数,看看效果;修改demo.html

<body>
<button id="btn">点击</button>

<script>
    function demo1(){
        console.log("demo1")
    }

</script>
<script class="lazy" data-src="http://127.0.0.1:8002/demo1/"></script>


</body>
View Code

修改demo1的view.py 

def demo1(request):
    return HttpResponse("demo1()")

 

nice,已经能执行函数了。那给函数加参数看看效果。

 修改demo.html

<body>
<button id="btn">点击</button>

<script>
    function demo1(ret){
        console.log(ret)
    }

</script>
<script class="lazy" data-src="http://127.0.0.1:8002/demo1/"></script>

</body>
View Code

修改demo1的view.py

import json
def demo1(request):
    ret = {"status": 1, "msg": "demo1"}
    return HttpResponse("demo1({})".format(json.dumps(ret)))
View Code

 刷新浏览器看效果。

 

这其实就是JSONP的简单实现模式,或者说是JSONP的原型:创建一个回调函数,然后在远程服务上调用这个函数并且将JSON 数据形式作为参数传递,完成回调。

将JSON数据填充进回调函数,这就是JSONP的JSON+Padding的含义。

 

通过js动态的创建script标签来实现数据的获取。

 修改demo.html

<body>
<button id="btn">点击</button>

<script>
    function demo1(ret){
        console.log(ret)
    }

    function addScriptTag(class="lazy" data-src) {
        var sTag = document.createElement("script");
        $(sTag).attr("class="lazy" data-src", class="lazy" data-src);
        $("body").append(sTag);
        $(sTag).remove();
    }

</script>

<script>
    $("#btn").click(function () {
        addScriptTag("http://127.0.0.1:8002/demo1/")
    })
</script>
</body>
View Code

此时通过按钮就可以动态的在页面上插入一个script标签,然后从后端获取数据。

 

为了实现更加灵活的调用,我们可以把客户端定义的回调函数的函数名传给服务端,服务端则会返回以该回调函数名,将获取的json数据传入这个函数完成回调。

 修改demo.html

<body>
<button id="btn">点击</button>

<script>
    function demo1(ret){
        console.log(ret)
    }

    function addScriptTag(class="lazy" data-src) {
        var sTag = document.createElement("script");
        $(sTag).attr("class="lazy" data-src", class="lazy" data-src);
        $("body").append(sTag);
        $(sTag).remove();
    }

</script>

<script>
    $("#btn").click(function () {
        addScriptTag("http://127.0.0.1:8002/demo1/?callback=demo1")
    })
</script>
</body>
View Code

修改demo1中的views.py

import json
def demo1(request):
    ret = {"status": 1, "msg": "demo1"}
    func_name = request.GET.get("callback")
    return HttpResponse("{}({})".format(func_name, json.dumps(ret)))
View Code

此时实现动态的调用了。

 

然而jQuery中有专门的方法实现jsonp。

修改demo.html

<body>
<button id="btn">点击</button>

<script>
    $("#btn").click(function () {
        $.getJSON("http://127.0.0.1:8002/demo1/?callback=?",function (data) {
            console.log(data)
        })
    })
</script>
View Code

注意的是在url的后面必须要有一个callback参数,这样getJSON方法才会知道是用JSONP方式去访问服务,callback后面的那个?是jQuery内部自动生成的一个回调函数名。

 

但是如果我们想自己指定回调函数名,或者说服务上规定了回调函数名该怎么办呢?我们可以使用$.ajax方法来实现:

修改demo.html

<body>
<button id="btn">点击</button>

<script>
    $("#btn").click(function () {
        $.ajax({
            url:"http://127.0.0.1:8002/demo1/",
            dataType:"jsonp",
            jsonp:"callback",
            jsonpCallback:"demo1"
        }).done(function (data) {
            console.log(data)
        })
    });
</script>
</body>
View Code

 

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Django—跨域请求(jsonp)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Django—跨域请求(jsonp)

同源策略如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源。 示例:两个Django demodemo1url.pyurl(r'^demo1/',demo1),view.pydef demo1(request):
2023-01-31

JavaScript JSONP:跨域请求的利器

跨域请求往往会受限于浏览器的同源策略,JavaScript中的JSONP(JSON with Padding)提供了一种绕过限制的巧妙解决方案,将响应封装在回调函数中,有效实现跨域数据传输。
JavaScript JSONP:跨域请求的利器
2024-02-28

JSONP入门:轻松实现跨域请求

JSONP是一种轻量级的跨域解决方案,允许脚本从一个域请求另一个域上的数据,打破了浏览器的同源策略限制。以下将深入探讨JSONP,并提供示例代码,帮助您轻松实现跨域请求。
JSONP入门:轻松实现跨域请求
2024-02-28

JavaScript JSONP:跨域请求的简明指南

JSONP(JSONP with Padding)是一种广泛采用的技术,允许您跨域发送HTTP请求,获取来自其他域名的JSON数据。它简单易用,是解决跨域限制的最佳方法之一。
JavaScript JSONP:跨域请求的简明指南
2024-02-28

详解SpringBoot多跨域请求的支持(JSONP)

在我们做项目的过程中,有可能会遇到跨域请求,所以需要我们自己组装支持跨域请求的JSONP数据,而在4.1版本以后的SpringMVC中,为我们提供了一个AbstractJsonpResponseBodyAdvice的类用来支持jsonp的数
2023-05-31

突破限制:JavaScript JSONP跨域请求指南

JSONP跨域请求是一种无需更改服务器端代码即可实现跨域请求的解决方案。本文将深入探讨JSONP的原理和实践,并提供分步指南,帮助你轻松突破跨域限制。
突破限制:JavaScript JSONP跨域请求指南
2024-02-28

jsonp和CORS跨域请求问题怎么解决

这篇文章主要讲解了“jsonp和CORS跨域请求问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“jsonp和CORS跨域请求问题怎么解决”吧!JSONPjsonp 的原理很简单,利
2023-06-02

快速解决跨域请求问题:jsonp和CORS

网上各种跨域教程,各种实践,各种问答,除了简单的 jsonp 以外,很多说 CORS 的都是行不通的,老是缺那么一两个关键的配置。本文只想解决问题,所有的代码经过亲自实践。本文解决跨域中的 get、post、data、cookie 等这些问
2023-05-30

JavaScript JSONP:跨域请求的终极解决方案

JSONP:跨域请求的终极解决方案
JavaScript JSONP:跨域请求的终极解决方案
2024-02-28

突破藩篱:使用JavaScript JSONP进行跨域请求

在现代网络应用中,跨域通信往往是开发人员面临的一大挑战。由于安全限制,浏览器实施了同源策略,阻止不同源的脚本访问和修改资源。然而,有一种有效的方法可以突破这些藩篱,即使用JavaScript JSONP (JSON with Padding) 技术。JSONP允许跨域请求和响应数据,而无需进行复杂的服务器端配置或违反安全策略。
突破藩篱:使用JavaScript JSONP进行跨域请求
2024-02-28

Django解决跨域请求的问题

一、引入  对于想要利用django框架实现前后端分离的童鞋来说,首要的问题便是解决跨域请求的问题。何为跨域请求?简单来说,就是当前发起的请求的域与该请求指向的资源所在的域不一致。当协议+域名+端口号均相同,那么就是同一个域。举个例子,ht
2023-01-30

JSONP精通:解决跨域请求的终极指南

JSONP是一种方便的跨域请求技术,允许Web应用程序从其他域获取数据,而无需复杂的安全配置。本文将深入探讨JSONP,演示如何使用它解决跨域请求问题。
JSONP精通:解决跨域请求的终极指南
2024-02-28

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录