Ajax_02

一、引言

	Ajax异步请求是Javascript和Python(或其它语言)的通信,也属于跨平台通信的范畴。数据格式采用了字符串的形式。      

	(Ajax是运用在客户端浏览器的技术,用于向服务器发送一个异步请求。 从发送请求--服务器接收并处理请求--返回响应结果,在此过程中客户端和服务器完成了一次数据交换。客户端发送“用户名”给服务器,服务器返回“用户名已存在/用户名合法”)

	之前通信的字符串中包含的数据量较小,OK、Error等简短的信息。   

	如果要在异步请求中通信更大量的数据呢,如何做? 

	比如:客户端发送一个请求到服务器,请求查询所有用户的信息,并显示在前端页面
二、数据交换格式
1、XML
简介
	XML可扩展标记语言(extensible Markup Language)。表示的是计算机所能理解的信息符号,通过这种标记,计算机之间可以处理包含各种数据信息。
	XML是一种标记语言,类似HTML
	XML的设计宗旨是传输数据,而非显示数据
	XML只是简单地描述信息,并以独立于平台的格式进行分发。由于不需要使用任何一种特定的语言,因此XML与平台无关。
简单实例
<?xml version="1.0" encoding="utf-8"?>      //指明了XML的版本号和编码方式
<Employees> 
 	<Employee> 
    	<Name>Bob Smith</Name> 
    	<PhoneNumber>408-555-1000</PhoneNumber> 
	 </Employee> 
 	<Employee> 
    	<Name>Sally Jones</Name> 
		<PhoneNumber>415-555-2000</PhoneNumber>         
	</Employee> 
</Employees>
作用
	XML是用来传送数据信息,HTML使用来表现数据,所以XML用途的焦点是说明数据是什么,以及携带的数据信息。

2、JSON

简介
	JSON(JavaScript Object Nonation)是一种轻量级的数据交换格式
	JSON完全独立于语言的文本格式,但是使用了类似于C语言家族的习惯(包括C、C++、C#、JavaScript、Java、Perl、Python等)。这些特性使JSON成为理想的数据交换语言
	易于人阅读和编写,同时也易于机器解析和生成(网络传输速度)。 
	JSON 文本格式在语法上与创建 JavaScript 对象的代码相同。由于这种相似性, 无需解析器, JavaScript 程序能够使用内建的 eval() 函数, 用 JSON 数据来生成原生的 JavaScript 对象。

JSON结构
JSON有两种结构,字典和数组
json和XML对比
	编码的可读性,xml有明显的优势,毕竟人类的语言更贴近这样的说明结构。json读起来更像一个数据块,读起来就比较费解了。不过,我们读起来费解的语言,恰恰是适合机器阅读和解析。

	编码的手写难度来说,xml还是舒服一些,好读当然就好写。不过写出来的字符JSON就明显少很多。去掉空白制表以及换行的话,JSON就是密密麻麻的有用数据,而xml却包含很多重复的标记字符。

	虽然XML和JSON都有各自的编码工具,但是JSON的编码要比XML简单,即使不借助工具,也可以写出JSON代码,但要写出好的 XML代码就有点困难;与XML一样,JSON也是基于文本的,且它们都使用Unicode编码,且其与数据交换格式XML一样具有可读性。

	主观上来看,JSON更为清晰且冗余更少些。JSON网站提供了对JSON语法的严格描述,只是描述较简短。从总体来看,XML比较适合于标记文档,而JSON却更适于进行数据交换处理。

	在解析上,在普通的web应用领域,开发者经常为XML的解析伤脑筋,无论是服务器端生成或处理XML,还是客户端用Python解析XML,都常常导致复杂的代码,极低的开发效率。 

	作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式。

	有的json代码格式比较混乱,可以使用此http://www.bejson.com/网站来进行JSON格式化校验。此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便。

三、Model转JSON

1、json.dumps

在Python中通过json模块,将常用的数据类型转化成json字符串。但是json支持的数据类型是有限的。

支持的数据类型

+-------------------+---------------+
| Python            | JSON          |
+===================+===============+
| dict              | object        |
+-------------------+---------------+
| list, tuple       | array         |
+-------------------+---------------+
| str               | string        |
+-------------------+---------------+
| int, float        | number        |
+-------------------+---------------+
| True              | true          |
+-------------------+---------------+
| False             | false         |
+-------------------+---------------+
| None              | null          |
+-------------------+---------------+
2、Model-JSON
def query(request):
    users = User.objects.all()    
    def user_default(u):
        if isinstance(u,User):
            return {'id':u.id,'name':u.name,'age':u.age,'salary':u.salary}
    json_str = json.dumps(list(users),default=user_default)   #将QuerySet对象转为list
    return HttpResponse(json_str)

或者

def query(request):
    users = User.objects.all().values()  #返回字典形式的QuerySet    
    json_str = json.dumps(list(users))   #将QuerySet对象转为list
    return HttpResponse(json_str)
# 使用此方法,需要注意User类中不能有不可序列化的类型
3、JsonResponse对象

参数

class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None,**kwargs) 
data			字典类型
safe			传入的数据类型不是字典就会报错,当设为false就可以是任意类型
json_dumps_params 对data的每个数据进行函数处理

总结

	1、JsonResponse内部会调用json.dumps,即JsonResponse的第一个参数可以直接接Model/集合

	2、但使用JsonResponse仍然需要设置default --JsonResponse(data,json_dumps_params={"default":user_default})

	3、如果data不是字典dict类型,需要将data转为dict {"key":data} 或者直接将safe参数设置为False

	4、如果JsonResponse的第一个参数是dict类型,则在Javascript中 eval("(" + xhr.responseText + ")")

	5、当使用JsonResponse返回时,传递的不是json字符串,而是json对象,即在javascript中接收的是一个json对象。

四、Jquery-Alax

1、$.ajax()
$.ajax({
   type:"POST",
   url:"{% url 'ajaxapp:test' %}",
   data:"name='as'&csrfmiddlewaretoken="+"{{ csrf_token }}",
   success:function (msg) {
       alert(msg)
   }
})
url:待载入页面的URL地址
data:待发送 Key/value 参数。
success:载入成功时回调函数。
type:请求的方式
datatype:返回内容格式,xml, html, script, json, text, _default。
2、$.get()
$.get(
    "{% url "ajaxapp:test" %}",          
    "name=as",
    function(data){
        alert(data)
    },
    "json"
)
url:待载入页面的URL地址
data:待发送 Key/value 参数。
callback:载入成功时回调函数。
type:返回内容格式,xml, html, script, json, text, _default。
3、$.post()
$.post(
    "{% url "ajaxapp:test" %}",
    "name=as&csrfmiddlewaretoken="+"{{ csrf_token }}",
    function(data){
        alert(data)
    },
    "text"
)
4、$.ajaxSetup()

作用

把相同的部分抽取出来,就不需要为每一个ajax请求配置参数
对$.get和$.post无效
//为所有的请求 设置headers和url参数选项
$.ajaxSetup({
    headers:{"X-CSRFToken":"{{ csrf_token }}"},
    url:"{% url 'ajax_query_user:query' %}"
    })
5、load()方法
load() 方法通过 AJAX 请求从服务器加载数据,并把返回的数据放置到指定的元素中。
$("#div_1").load("{% url 'ajaxapp:loadHTML' %}")
其实就是把接收的数据放在页面上
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值