Django与Ajax

Ajax


异步提交,局部刷新

ajax不是一门新的技术并且有很多版本,我们目前学习的是jquery版

一、Ajax简介

1.什么是ajax

Ajax即Asynchronous Javascript And XML 也就是异步 JavaScript和 XML

  • 异步:和同步对应
  • JavaScript:通过JavaScript来操作,发送请求到服务端
  • XML:数据交互使用XML,现在主流使用JSON格式
  • 局部刷新:JS的DOM操作

即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)

2.同步与异步

  • 同步交互:客户端发出一个请求后,需要等待服务器响应接受后,才能发出第二个请求
  • 异步交互:客户端发出一个请求后,不需要等待服务器响应结束,就可以发出第二个请求

3.XML格式与JSON格式

XML格式:

<name>duoduo</name>
<age>18</age>

JSON格式:

{
"name":"duoduo",
"age":"18",
}

对比:

格式 可阅读性 解析难度 空间占用
XML 复杂
JSON 简单

二、基本语法

$.ajax({
url:'',
type:'post', // 请求方式 默认也是get
data:{'v1':v1Val, 'v2':v2Val},
success:function (args) {
后端响应的数据
// 成功后 触发,后端返回结果之后自动触发 args接收后端返回的数据
},
error:function () {
// 失败后 触发
}
})
  • url 控制数据提交的地址

    有三种填写方式,与form标签的action一致

    1)不填写--超当前地址提交

    2)填写一个完整的网址--超完整网址提交

    3)路由--超该路由提交

  • type控制数据提交的方式

    请求方式 默认也是get

  • data提交的数据

    发送的数据,以字典的形式发送

  • success 异步回调函数

    args接收后端返回的数据

    使用ajax交互,后端返回的数据会被args接受,不再影响整个浏览器页面

如何发送ajax:

  • 通过绑定点击事件
  • input框监听事件

三、Content-Type参数

编码格式,类似于数据报头

image-20221219115927546

1.urlencoded

ajax默认的编码格式、form表单默认的格式

数据格式 :xxx=yyy&uuu=ooo&...

django后端会自动将urlencoded数据处理到request.POST/request.GET

2.form data

包括文件数据

django后端针对普通的键值对还是处理到request.POST中,但是针对文件会处理到request.FILES

3.Application/Json

ajax支持发送的数据

  • 普通数据urlencoded
  • form data
  • Application/json

request.body 前端发送的数据都先放在body中,如果是普通数据发送给POST,如果是文件会将普通数据放到POST中,文件数据交给FILES中

而json格式的数据则不处理放在body中,后端自己处理json格式数据

  • 发送Json格式数据

    1.确保data对应的数据是json格式字符串

    data:JSON.stringify({})

    image-20221220150340489

    如果发送的是普通的字典,那么收到的数据会以xxx=yyy&aaa=bbb的形式展现,所以当以Json格式发送,浏览器则会有更好的渲染效果

    image-20221220150847223

    2.修改数据编码格式(默认是)

<script>
$('#d1').click(function (){
$.ajax({
url:'',
type:'post',
data:JSON.stringify({'name':'jason','age':18}),
contentType:'application/json',
success:function (){
alert('多喝热水哦')
}
})
})
</script>

四、Ajax携带文件数据

  • 1.data换成文件对象

  • 2.添加两个键值对

    contentType:false

    processData:false

<script>
$('#d3').click(function () {
// 1.先产生一个FormData对象
let myFormDataObj = new FormData();
// 2.往该对象中添加普通数据
myFormDataObj.append('name', 'jason');
myFormDataObj.append('age', 18);
// 3.往该对象中添加文件数据
myFormDataObj.append('file', $('#d2')[0].files[0])
// 4.发送ajax请求
$.ajax({
url:'',
type:'post',
data:myFormDataObj,
// ajax发送文件固定的两个配置
contentType:false,
processData:false,
success:function (args){
alert(args)
}
})
})
</script>

五、Ajax补充说明

主要是针对回调函数args接收到的数据

1.后端:request.is_ajax()

判断是否是ajax请求

2.后端返回的三大方法都会被ajax接收,不再影响整个浏览器页面

选择和ajax交互,那么返回给后端的数据都会被ajax回调函数中的args形参接受

3.选择使用ajax数据

(1)JSON模块进行序列化

  • 后端序列化
def ab_ajax_func(request):
if request.method == "POST":
user_dict = {"username": "duoduo", 'hobby': '你好吗'}
import json
json_data = json.dumps(user_dict)
return HttpResponse(json_data)
return render(request, 'ajaxtest.html')
image-20221220170654109

通过自定义响应码,可以通过响应码的不同,在前端的ajax回调函数中做出不同的结果

  • 前端反序列化
$('#d1').click(function(){
$.ajax({
url:'',
type:'post',
data:{'name':'duoduo'},
success:function (args){
console.log(args);
console.log(typeof args);
console.log(args.username);
let userObj = JSON.parse(args)
console.log(userObj);
console.log(typeof userObj);
console.log(userObj.username);
}
})
})

image-20221220165903404

(2)JsonResponse

  • 后端:通过JsonResponse
def ab_ajax_func(request):
if request.method == "POST":
user_dict = {"username": "duoduo", 'hobby': '你好吗'}
return JsonResponse(user_dict)
return render(request, 'ajaxtest.html')
  • 前端:加一个配置dataType:'json'
$('#d1').click(function(){
$.ajax({
url:'',
type:'post',
data:{'name':'duoduo'},
dataType:'json',
success:function (args){
console.log(args);
console.log(typeof args);
console.log(args.username);
console.log(args.hobby);
}
})
})

image-20221220164507821

posted @   Duosg  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示