目录
一、AJAX(重要)
Ajax(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。
AJAX 不是新的编程语言,而是一种使用现有标准的新方法。
AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)
AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。
- 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
- 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。
Ajax是一门js的技术,基于原生js开发的,但是用原生的js写代码过于繁琐,因此在这里我们只通过jQuery实现
1.1 特性
异步提交
同步异步:描述的任务的提交方式
同步:提交任务之后 原地等待任务的返回结果 期间不干任何事儿
异步:提交任务之后 不愿地等待 直接执行下一行代码 任务的返回通过回调机制 阻塞非阻塞:程序的运行状态
程序运行的三状态图
局部刷新
一个页面 不是整体刷新 而是页面的某个地方局部刷新
1.2 基本使用
注意:单独的AJAX当然看不出来任何效果,因此他需要和后端一起来说。
例子:展示一个前端页面,页面上有三个输入框,前两个框输入数字,点击按钮朝后端发请求,页面不刷新的情况下,完成数字的加法运算 。
<input type="text" id="t1"> + <input type="text" id="t2"> = <input type="text" id="t3">
<p>
<button id="b1">计算</button>
</p>
<script>
// 绑定点击事件
$("#b1").on("click",function () {
// 绑定ajax事件,向后端发请求
$.ajax({
// 1.向哪个地址发请求
url:"",// 专门用来控制朝后端提交数据的地址 不写默认就是朝当前地址提交
// 2.发送什么类型的请求
type:"post",
// 3.要发送什么数据
data:{"t1":$("#t1").val(),"t2":$("#t2").val(),"t3":$("#t3").val(),},
// 4.异步提交的任务 需要通过回调函数来处理
success:function (data) { // data形参指代的就是异步提交的返回结果
// 通过DOM操作将内容 渲染到标签内容上
$('#t3').val(data)
}
})
})
</script>
'''AJAX前后端交互'''
def ajax(request):
# 判断是否是ajax请求,布尔值
if request.is_ajax():
if request.method == "POST":
'''
如果请求文本的数据格式是:urlencoded
Django就会将解析到的数据放到request.POST中
'''
print(request.POST)
t1 = request.POST.get('t1')
t2 = request.POST.get('t2')
res = int(t1) + int(t2)
return HttpResponse(res)
return render(request,"ajax.html")
1.3 Ajax传json格式数据
django后端针对json格式的数据不会自动帮你解析,会直接原封不动的给你放到request.body
中。
JavaScript中关于JSON对象和字符串转换的两个方法:
- JSON.stringify(): 用于将 JavaScript 值转换为 JSON 字符串。
- JSON.parse(): 用于将一个 JSON 字符串转换为 JavaScript 对象(json只认双引的字符串格式)
<input type="text" id="t1"> + <input type="text" id="t2"> = <input type="text" id="t3">
<p>
<button id="b1">计算</button>
</p>
<script>
// 绑定点击事件
$("#b1").on("click",function () {
// 绑定ajax事件,向后端发请求
$.ajax({
// 1.向哪个地址发请求
url:"",// 专门用来控制朝后端提交数据的地址 不写默认就是朝当前地址提交
// 2.发送什么类型的请求
type:"post",
// 设置文本数据格式类型,默认是urlencoded
contentType:'application/json', // 设置数据格式为json
// 3.要发送什么数据
{#data:{"t1":$("#t1").val(),"t2":$("#t2").val(),"t3":$("#t3").val(),},#} // 普通格式数据
// json格式数据
data: JSON.stringify({"t1":$("#t1").val(),"t2":$("#t2").val(),"t3":$("#t3").val(),}),
// 4.异步提交的任务 需要通过回调函数来处理
success:function (data) { // data形参指代的就是异步提交的返回结果
// 通过DOM操作将内容 渲染到标签内容上
$('#t3').val(data)
}
})
})
</script>
'''AJAX前后端交互'''
def ajax(request):
# 判断是否是ajax请求,布尔值
if request.is_ajax():
if request.method == "POST":
'''
如果请求文本的数据格式是:json
Django不会解析,会直接原封不动的放到 request.body
需要你自己去反序列化
'''
print(request.POST) # 空
print(request.body) # byte类型数据
# 序列化request.body得到字典
data_json = json.loads(request.body) # 字典
t1 = data_json.get('t1')
t2 = data_json.get('t2')
res = int(t1) + int(t2)
return HttpResponse(res)
return render(request,"ajax.html")
注意点
1.指定contentType参数
contentType:'application/json',
2.要将你发送的数据 确保是json格式的
data:JSON.stringify({'username':'jason','password':'123'})
1.4 AJAX传文件
- 需要利用内置对象 Formdata提交文件,该对象既可以传普通的键值 也可以传文件
- ajax传文件 一定要指定两个关键性的参数
- contentType:false,
- processData:false,
<input type="text" name="username" id="t1">
<input type="text" name="password" id="t2">
<input type="file" name="myfile" id="t3">
<button id="b1">提交</button>
<script>
$("#b1").on("click",function () {
// 1.实例化FormData对象
var myFormData = new FormData();
// 2.朝对象中添加普通的键值
myFormData.append('username',$("#t1").val());
myFormData.append('password',$("#t2").val());
// 3.朝对象中添加文件数据
// 1.先找到该标签
// 2.转换成js对象
// 3.通过js对象的方法 files ,获取文件内容 [0]
myFormData.append("myfile",$("#t3")[0].files[0]);
$.ajax({
url:"",
type:"post",
// 数据,一定放对象
data:myFormData,
// ajax传文件 一定要指定两个关键性的参数
contentType:false, // 不用任何编码 因为FormData对象自带编码
processData:false, // 告诉浏览器不要处理我的数据 直接发就行
// 回调函数,data是接收的参数
success:function (data) {
alert(data)
}
})
})
</script>
'''AJAX传文件'''
def ajax_file(request):
# 判断是否是ajax请求,布尔值
if request.is_ajax():
if request.method == "POST":
print(request.POST) # 这里还是正常传递过来的数据
print(request.FILES) # 但是这里就是一个文件对象
user = request.POST.get("username")
pwd = request.POST.get("password")
myfile = request.POST.get("myfile")
print(user,pwd,myfile)
return HttpResponse('收到啦')
return render(request,"ajax_file.html")
ajax传文件需要注意的事项
1.利用formdata对象 能够简单的快速传输数据 (普通键值 + 文件)
2.有几个参数主要注意
data:FormData对象
contentType:false
processData:false
二、contentType前后端传输数据编码格式
form表单 默认的提交数据的编码格式是urlencoded
urlencoded
username=admin&password=123这种就是符合urlencoded数据格式 django后端针对username=admin&password=123的urlencoded数据格式会自动解析 将结果打包给request.POST 用户只需要从request.POST即可获取对应信息
formdata
django后端针对formdata格式类型数据 也会自动解析 但是不会放到request.POST中而是给你放到了request.FILES中
ajax默认的提交数据的编码格式也是urlencoded
总结
django后端针对不同的编码格式数据 会有不同的处理机制以及不同的获取该数据的方法
前后端在做数据交互的时候,一定一定要表明你所发的的数据到底是什么格式。
你的数据是什么格式 你就应该准确无误告诉别人是什么格式,你不能骗人家
三、序列化组件
如果我的前端想拿到由ORM得到的数据库里面的一个个用户对象,我的后端想直接将实例化出来的数据对象直接发送给客户端,并且前端能识别。这时候可以自己写一个方法,把每个对象封装成字典的格式,然后将所有的字典放到列表中返回出去。也可以使用相应的模块。毕竟django号称掉包侠。
3.1 自己实现
'''序列化组件'''
def my_serializers(request):
user_queryset = models.UserInfo.objects.all()
'''自己实现orm对象序列化'''
user_list = []
for user_obj in user_queryset:
user_list.append({
"user": user_obj.user,
"pwd": user_obj.password,
'gender': user_obj.get_gender_display(),
})
user_json = json.dumps(user_list)
return render(request,"my_serializers.html",locals())
3.2 Django内置的serializers
'''序列化组件'''
from django.core import serializers
def my_serializers(request):
user_queryset = models.UserInfo.objects.all()
'''使用Django内置的serializers'''
user_json = serializers.serialize('json', user_queryset)
return render(request,"my_serializers.html",locals())
四、ajax + sweetalert
<script>
$("#submit").on("click",function () {
$.ajax({
url:"",
type:"post",
data:{"user":$("#login_btn").val(),"pwd":$("#pwd_btn").val(),},
success:function (data) {
if (data.code==1000){
swal(data.msg, "", "success");
}else{
swal(data.msg, "", "error");
}
}
})
});
</script>
'''登陆校验'''
if userobj:
if userobj.password == pwd:
user_info["user"] = user
'''ajax + sweetalert'''
back_dic['code'] = 1000
back_dic['msg'] = '登陆成功'
return JsonResponse(back_dic)
else:
'''ajax + sweetalert'''
back_dic['code'] = 2000
back_dic['msg'] = '账号或密码错误'
return JsonResponse(back_dic)
else:
'''ajax + sweetalert'''
back_dic['code'] = 2000
back_dic['msg'] = '用户不存在'
return JsonResponse(back_dic)