一、基于jQuery的ajax实现(最底层方法:$.jax())

  $.ajax(

    url:

    type:''POST“

  )

  $.get(url,[data],[callback],[type])  #callback是发送成功后就执行的函数,type是告诉服务器需要什么数据,type:text|html|json|script

  $.post(url,[data],[callback],[type])

  例子:

  $.get('/jquery_get/',{name:'gavin'}) //name关键字是不加引号的

  $.post('/jquery_get',{name:'kobe'},function(data,stateText,obj){

      console.log(data,stateText,obj)

    })  //function里的data参数是服务器端返回的数据,stateText 表示返回的状态,obj是js里的xmlHttprequest,里面包含很多数据,包含状态码,readystatus(1,2,3,4分别表示四个状态步骤)

  $.getJson()就是$.get()的type定义为json

  $.getScript('/static/test.js',function(){

    add(2,5)

    })   //前面表示js文件的位置,后面表示该js文件中的函数调用,这个表示即时加载时使用

  $.ajax({

    url:'',

    type:'POST',

    data:{},

  })

  例子:

  

  $.ajax({

    url:'/jquery_get/',

    type:'POST',

    data:{a:1,b:2},

    traditional:true //默认情况下,data里只能传送字典类型,如果data中的字典里面带字典或者字典里带列表,需要使用

    processData:false,   //告诉后端不要使用任何编码进行处理,保持原封不动,默认是true

    contentType:‘application/json’,//浏览器给服务器看的类型

    dataType:"json",//后端发送给前端的类型

    beforeSend:function(data){   //发送之前的操作

      jqXHR.setRequestHeader(‘test’: 'haha') ;

     jqXHR.testData=(a:1,b:2);

    },

    success: function(data){   //回调函数

         data=JSON.parse(data) }类似于python的load,处理json的数据  

    complete:function(data){

      console.log(data);

      console.log(data,testData); //无论是否成功都会执行

    },

    error:function(data){//不success时执行

      console.log(arguments)   //打印错误信息

      alert(data);

    },  

  })

  

二、JSON

    json就是js的数据表现形式

    python与json对象的对应

     python         -->        json
dict object
list,tuple array
str,unicode string
int,long,float number
True true
False false
None null

    

    parse()和.stringify()

parse() 用于从一个json字符串中解析出json对象,如

var str = '{"name":"yuan","age":"23"}'

结果:JSON.parse(str)     ------>  Object  {age: "",name: "yuan"}

stringify()用于从一个json对象解析成json字符串,如

var c= {a:1,b:2} 

结果:  JSON.stringify(c)     ------>      '{"a":1,"b":2}'

注意1:单引号写在{}外,每个属性名都必须用双引号,否则会抛出异常。
注意2: a={name:"yuan"}; //ok
b={'name':'yuan'}; //ok
c={"name":"yuan"}; //ok alert(a.name); //ok
alert(a[name]); //undefined
alert(a['name']) //ok

  

 三、跨域请求

 

  同源策略机制

浏览器有一个很重要的概念——同源策略(Same-Origin Policy)。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况下,不能读写对方的资源。

简单的来说,浏览器允许包含在页面A的脚本访问第二个页面B的数据资源,这一切是建立在A和B页面是同源的基础上。

如果Web世界没有同源策略,当你登录淘宝账号并打开另一个站点时,这个站点上的JavaScript可以跨域读取你的淘宝账号数据,这样整个Web世界就无隐私可言了。

  

  jsonp的js实现

JSONP是JSON with Padding的略称。可以让网页从别的域名(网站)那获取资料,即跨域读取数据。

它是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。

JSONP就像是JSON+Padding一样(Padding这里我们理解为填充):

#---------------------------http://127.0.0.1:8001/login

 def login(request):
print('hello ajax')
return render(request,'index.html')
#---------------------------返回用户的index.html
<h1>发送JSONP数据</h1> <script>
function fun1(arg){
alert("hello"+arg)
}
</script>
<script src="http://127.0.0.1:8002/get_byjsonp/"></script> //返回:<script>fun1("yuan")</script> #-----------------------------http://127.0.0.1:8002/get_byjsonp def get_byjsonp(req):
print('8002...')
return HttpResponse('fun1("yuan")')

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

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

一般情况下,我们希望这个script标签能够动态的调用,而不是像上面因为固定在html里面所以没等页面显示就执行了,很不灵活。我们可以通过javascript动态的创建script标签,这样我们就可以灵活调用远程服务了。

<button onclick="f()">submit</button>

<script>
function addScriptTag(src){
var script = document.createElement('script');
script.setAttribute("type","text/javascript");
script.src = src;
document.body.appendChild(script);
document.body.removeChild(script);
}
function fun1(arg){
alert("hello"+arg)
} function f(){
addScriptTag("http://127.0.0.1:8002/get_byjsonp/")
}
</script>

  为了更加灵活,现在将你自己在客户端定义的回调函数的函数名传送给服务端,服务端则会返回以你定义的回调函数名的方法,将获取的json数据传入这个方法完成回调:

  

<button onclick="f()">submit</button>

<script>
function addScriptTag(src){
var script = document.createElement('script');
script.setAttribute("type","text/javascript");
script.src = src;
document.body.appendChild(script);
document.body.removeChild(script);
}
function SayHi(arg){
alert("Hello "+arg)
} function f(){
addScriptTag("http://127.0.0.1:8002/get_byjsonp/?callbacks=SayHi")
}
</script> ----------------------views.py
def get_byjsonp(req): func=req.GET.get("callbacks") return HttpResponse("%s('yuan')"%func)

  jQuery对JSONP的实现

  jQuery框架也当然支持JSONP,可以使用$.getJSON(url,[data],[callback])方法

 

<script type="text/javascript">
$.getJSON("http://127.0.0.1:8002/get_byjsonp?callback=?",function(arg){
alert("hello"+arg)
});
</script>

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

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

<script type="text/javascript" src="/static/jquery-2.2.3.js"></script>

<script type="text/javascript">
$.ajax({
url:"http://127.0.0.1:8002/get_byjsonp",
dataType:"jsonp",
jsonp: 'callbacks',
jsonpCallback:"SayHi"
});
function SayHi(arg){
alert(arg);
}
</script> #--------------------------------- http://127.0.0.1:8002/get_byjsonp
def get_byjsonp(req): callback=req.GET.get('callbacks')
print(callback)
return HttpResponse('%s("yuan")'%callback)

  当然,最简单的形式还是通过回调函数来处理:

<script type="text/javascript" src="/static/jquery-2.2.3.js"></script>

<script type="text/javascript">
$.ajax({
url:"http://127.0.0.1:8002/get_byjsonp",
dataType:"jsonp", //必须有,告诉server,这次访问要的是一个jsonp的结果。
jsonp: 'callbacks', //jQuery帮助随机生成的:callbacks="wner"
success:function(data){
alert(data)
}
}); </script>
#-------------------------------------http://127.0.0.1:8002/get_byjsonp
def get_byjsonp(req): callbacks=req.GET.get('callbacks')
print(callbacks) #wner return HttpResponse("%s('yuan')"%callbacks)

  

jsonp: 'callbacks'就是定义一个存放回调函数的键,jsonpCallback是前端定义好的回调函数方法名'SayHi',server端接受callback键对应值后就可以在其中填充数据打包返回了;

jsonpCallback参数可以不定义,jquery会自动定义一个随机名发过去,那前端就得用回调函数来处理对应数据了。

     利用jQuery可以很方便的实现JSONP来进行跨域访问。  

  注解1: JSONP一定是GET请求

  注解2:

<button onclick="f()">submit</button>

<script src="/static/jquery-1.8.2.min.js"></script>
<script type="text/javascript">
function f(){
$.ajax({
url:"http://127.0.0.1:8002/get_byjsonp",
dataType:"jsonp",
jsonp: 'callbacks',
success :function(data){ //传过来的数据会被转换成js对象
console.log(data); //Object {name: Array[2]}
console.log(typeof data); //object
console.log(data.name) //["alex", "alvin"]
}
});
}
</script>
---------------------------------------------views.py
def get_byjsonp(req): func=req.GET.get("callbacks") a=json.dumps({'name':('alex','alvin')})
return HttpResponse("%s(%s)"%(func,a)) #return HttpResponse("%s({'name':('alex','alvin')})"%func) #return HttpResponse("%s('hello')"%func)
#return HttpResponse("%s([12,34])"%func)
#return HttpResponse("%s(5)"%func)

  补充:

#views.py 中可以用  request.is_ajax() 方法判断是否是 ajax 请求,需要添加一个 HTTP 请求头:

#原生javascript:
#xmlhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
#用 jQuery:
#用 $.ajax 方法代替 $.get,因为 $.get 在 IE 中不会发送 ajax header #注意:is_ajax()在跨域ajax请求时不好使 is_ajax()

  

Python学习笔记第二十六周(Django补充)的更多相关文章

  1. Python学习笔记第二十五周(Django补充)

    1.render_to_reponse() 不同于render,render_to_response()不用包含request,直接写template中文件 2.locals() 如果views文件中 ...

  2. Python学习笔记第十六周

    目录: 一.CSS补充 1.页面布局 二.JavaScript补充 1.条件判断 2.函数分类 3.序列化 4.转义 5.eval 6.时间 7.作用域 三.DOM 1.间接查找 文本操作 样式操作 ...

  3. Python学习笔记第二十二周(前端知识点补充)

    目录: 一.伪类 二.样式 1.字体 2.背景图片 3.margin和padding 4.列表属性 5.float 6.clear 7.position 8.text-decoration(a标签下划 ...

  4. Python学习笔记第二十四周(JavaScript补充)

    目录: 一.JS补充 1.函数类型 2.string对象 3.instanceof 4.Array 数组对象 5.Date对象 6.RegExp 正则表达式 7.Math对象 二.BOM补充 1.wi ...

  5. Python学习笔记第二十周

    目录: 一.ORM 1.查询补充 备注:forloop.counter介绍 二.Ajax 三.ORM多对多操作 内容: 一.ORM 1.查询补充: 1.models.USR.objects.all() ...

  6. Python学习(二十六)—— Django基础一

    转载自:http://www.cnblogs.com/liwenzhou/p/8258992.html 一.Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的 ...

  7. Python学习笔记第十八周

    目录: 一.JavaScript正则表达式 1.test  2.exec 二.BootStrap  1.响应式  2.图标.字体  3.基本使用 三.Django 1.安装  2.创建目录  3.进入 ...

  8. Python学习笔记第十九周

    目录: 一.路由系统URL 1.Django请求生命周期 2.创建Django project 3.配置 4.编写程序 二.视图 三.模板 四.ORM操作 内容: 一.URL 1.Django请求生命 ...

  9. Python学习笔记第十五周

    目录: 一.CSS补充 1.position 2.overflow 3.hover 4.background 二.JavaScript 三.DOM 主要内容: 一.CSS补充 1.position 可 ...

随机推荐

  1. micropython驱动sh1106点亮oled

    继上一帖给esp32刷入micropython之后,忍不住给以esp12e也刷了micropython 这里先说一下webrepl: 通过wifi可以和esp8266交互,以及便携的传输文件 首次使用 ...

  2. Mac OS X 显示和隐藏文件

    参考: mac系统如何显示和隐藏文件 Mac OSX系统 显示和隐藏文件 1.显示隐藏文件: 打开Terminal,并输入以下命令: defaults write com.apple.finder A ...

  3. Windows环境——MySQL安装及配置

    Mysql安装 下载地址:https://dev.mysql.com/downloads/mysql/ 根据个人需求,选择对应的操作系统,进行安装,本次安装的版本为5.7.24版本. 1.  安装完成 ...

  4. HDU 2612 (2次BFS,有点小细节)

    Problem Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. L ...

  5. JS实时获取输入框中的值

    实时获取input输入框中的值需要oninput和onpropertychange属性来实现.原因是onpropertychange属性为IE专属,而oninput属性支持大部分浏览器包括IE9及以上 ...

  6. 多路径multipath配置,udev绑定

    多路径multipath配置 以root用户登录 1.查看共享磁盘是否挂载成功 #fdisk -l 2.生成配置文件 #mpathconf --enable 修改配置文件权限 #chmod 644 / ...

  7. 《Practical Vim》第八章:利用动作命令在文档中移动

    面向单词的移动 定义: Vim 提供了面向单词的动作命令,用于将光标正向/反向移动一个单词; 功能 命令 正向移动到下一单词开头 w 反向移动到上一单词的开头 b 正向移动到下一单词(当前单词)的结尾 ...

  8. 关于window 图片系统功能

    直接选择文件悬浮  分辨率 大小 修改时间 文件选择较少的 可以选择反选  找到自己想要的 大小排序 找到最大的压缩  名称排序 同一类的图片  按时间排序找自己刚修改的图片 文档类预览

  9. LOJ10155数字转换

    题目描述 如果一个数 x 的约数和 y (不包括他本身)比他本身小,那么 x 可以变成 y,y 也可以变成 x.例如 4 可以变为 3,1 可以变为 7.限定所有数字变换在不超过 n 的正整数范围内进 ...

  10. 【转】 SQL - 生成指定范围内的随机数

    DECLARE @Result INT DECLARE @Upper INT DECLARE @Lower INT SET @Lower = 1 SET @Upper = 10 SELECT @Res ...