同源策略

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

示例:两个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>

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

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

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

修改demo.html

<body>
<button id="btn">点击</button> <script src="http://127.0.0.1:8002/demo1"></script> </body>

刷新浏览器

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

<body>
<button id="btn">点击</button> <script>
var demo1 = "demo1"
</script>
<script src="http://127.0.0.1:8002/demo1/"></script> </script>
</body>

然后不报错了。

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

<body>
<button id="btn">点击</button> <script>
function demo1(){
console.log("demo1")
} </script>
<script src="http://127.0.0.1:8002/demo1/"></script> </body>

修改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 src="http://127.0.0.1:8002/demo1/"></script> </body>

修改demo1的view.py

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

刷新浏览器看效果。

这其实就是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(src) {
var sTag = document.createElement("script");
$(sTag).attr("src", src);
$("body").append(sTag);
$(sTag).remove();
} </script> <script>
$("#btn").click(function () {
addScriptTag("http://127.0.0.1:8002/demo1/")
})
</script>
</body>

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

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

修改demo.html

<body>
<button id="btn">点击</button> <script>
function demo1(ret){
console.log(ret)
} function addScriptTag(src) {
var sTag = document.createElement("script");
$(sTag).attr("src", src);
$("body").append(sTag);
$(sTag).remove();
} </script> <script>
$("#btn").click(function () {
addScriptTag("http://127.0.0.1:8002/demo1/?callback=demo1")
})
</script>
</body>

修改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)))

此时实现动态的调用了。

然而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>

注意的是在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>

Django—跨域请求(jsonp)的更多相关文章

  1. Django跨域请求之JSONP和CORS

    现在来新建一个Django项目server01,url配置为 url(r'^getData.html$',views.get_data) 其对应的视图函数为get_data: from django. ...

  2. 浏览器同源策略,跨域请求jsonp

    浏览器的同源策略 浏览器安全的基石是"同源政策"(same-origin policy) 含义: 1995年,同源政策由 Netscape 公司引入浏览器.目前,所有浏览器都实行这 ...

  3. 循序渐进Python3(十一) --6--  Ajax 实现跨域请求 jsonp 和 cors

    Ajax操作如何实现跨域请求?       Ajax (XMLHttpRequest)请求受到同源策略的限制.       Ajax通过XMLHttpRequest能够与远程的服务器进行信息交互,另外 ...

  4. AJAX 跨域请求 - JSONP获取JSON数据

    Asynchronous JavaScript and XML (Ajax ) 是驱动新一代 Web 站点(流行术语为 Web 2.0 站点)的关键技术.Ajax 允许在不干扰 Web 应用程序的显示 ...

  5. jquery跨域请求jsonp

    服务端PHP代码  header('Content-Type:application/json; charset=utf-8'); $arr = array('a'=>1, 'b'=>2, ...

  6. 跨域请求 & jsonp

    0 什么是跨域请求 在一个域名下请求另外一个域名下的资源,就是跨域请求.example 1:比如:我当前的域名是http://che.pingan.com.我现在要去请求http://www.cnbl ...

  7. 【JS跨域请求】Ajax跨域请求JSONP

    前两天被问到ajax跨域如何解决,还真被问住了,光知道有个什么jsonp,迷迷糊糊的没有说上来.抱着有问题必须解决的态度,我看了许多资料,原来如此... 为何一直知道jsonp,但一直迷迷糊糊的不明白 ...

  8. 关于laravel框架的跨域请求/jsonp请求的理解

    最近刚接触laravel框架,首先要写一个跨域的单点登录.被跨域的问题卡了两三天,主要是因为对跨域这快不了解,就在刚才有点茅塞顿开的感觉,我做一下大概整理,主要给一些刚接触摸不着头脑的看,哪里写得不对 ...

  9. JS跨域请求 JSONP B/S全代码

    Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面.动态网页.web服务.WCF,只要是跨域请求,一律不准:Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有 ...

  10. 【转】AJAX 跨域请求 - JSONP获取JSON数据

    来源:http://justcoding.iteye.com/blog/1366102/ Asynchronous JavaScript and XML (Ajax ) 是驱动新一代 Web 站点(流 ...

随机推荐

  1. 内存泄漏(Memory Leak)

    什么情况下会导致内存泄露(Memory Leak)? Android 的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器为24M.因此我们所能利用 的内存空间是有限的.如果我们的 ...

  2. [LOJ3084][GXOI/GZOI2019]宝牌一大堆——DP

    题目链接: [GXOI/GZOI2019]宝牌一大堆 求最大值容易想到$DP$,但如果将$7$种和牌都考虑进来的话,$DP$状态不好设,我们将比较特殊的七小对和国士无双单独求,其他的进行$DP$. 观 ...

  3. magento 由于Httpd进程增多,导致CPU占用100%问题

    由于Httpd进程增多,导致CPU占用100%问题 magento for version 2.2.3 前些天一直导致CPU无法控制的增多问题. 根据报错我设置了如下内容: [Mysql]mysql. ...

  4. Cucumber语法格式

    @login Feature: Login @T1 Scenario: Login with correct credentail Given I open login page When I ent ...

  5. 关于vue-router 中参数传递的那些坑(params,query)

    1.query方式传参和接受参数 传参 this.$router.push({ path:'/xxx' query:{ idname:id } })接收的方式:this.$route.query.id ...

  6. 什么是MIPI

        随着客户要求手机摄像头像素越来越高同时要求高的传输速度传统的并口传输越来越受到挑战.提高并口传输的输出时钟是一个办法但会导致系统的EMC设计变得越来困难,增加传输线的位数是但是这又不符合小型化 ...

  7. Matrix-tree 定理的一些整理

    \(Matrix-tree\) 定理用来解决一类生成树计数问题,以下前置知识内容均是先基于无向无权图来介绍的.有关代数余子式的部分不是很明白,如果有错误还请指出-- 部分内容参考至:\(Blog\_1 ...

  8. php操作excel表格的导入和导出

    前言:对于excel大家肯定熟悉不过了的,那么我们在日常的业务中应该是有对这些文件的导入导出操作的 类的下载:composer require phpoffice/phpexcel,其中Classes ...

  9. (二)初探Maven之设置代理和阿里云镜像

    引言:           在许多公司,可能因为安全性的要求配置了代理服务器,用户无法直接访问外网,所以在项目中使用Maven必须设置好代理才能下载依赖.           并且直接从中央仓库下载依 ...

  10. webpack配置less

    webpack4.0把webpack.config.js隐藏起来了,需要先暴露出来,在webpack修改配置