本节内容:
1、Ajax简介
2、基于jQuery的ajax实现
3、案例
4、请求头ContentType(看完后,看后面的文件上传实例来看)
5、文件上传
一、Ajax简介
AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。
即使用Javascript语言与服务器进行异步交互,
传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)。
同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。
1、ajax的优点
1、ajax使用Javascript技术向服务器发送异步请求(异步)
2、可以局部刷新(这一特点给用户的感受是在不知不觉中完成请求和响应过程)
(实际上是:偷偷的发送请求,偷偷的响应,通过绑定事件及限定范围的刷新)
2、应用场景:注册时输入用户名,光标移动就会验证,提示用户
二、基于jQuery的ajax实现
1、ajax的请求流程
第一步:绑定一个事件,触发ajax,ajax请求将相关数据发送到服务器
第二步:服务器根据url找到对应的视图函数,执行后返回结果给回调函数
第三步:回调函数执行逻辑后,将最终结果返回给前端(浏览器)
2、ajax示例,携带参数,input计算及发送json数据
views.py文件示例
from django.shortcuts import render,HttpResponse
# Create your views here.
import time
import json
from django.http import JsonResponse # 使用自带的json类,就不用我们手动json
def index(request):
#time.sleep(5)
return render(request,"index.html")
def ajax_handle(request):
# time.sleep(5)
return HttpResponse("Yuan!")
def ajax_handle2(request):
print(request.POST)
print(request.GET)
return HttpResponse("data has received!")
def cal(request):
res={"state":1000,"data":None,"msg":None}
try:
num1 = request.POST.get("num1") # 拿到前端发送的数字进行计算
num2 = request.POST.get("num2")
ret = str(int(num1)+int(num2))
res["data"]=ret # 修改数据,将计算的结果赋值给该键值对
except Exception as e:
res["state"]=1001
res["msg"]="请输入合法的字符"
return JsonResponse(res) # 使用json类自动发送json字符串给前端
Python
index.html文件示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
</head>
<body>
{% csrf_token %}
<h3>INDEX</h3>
<hr>
<button class="ajax">ajax</button>
<p class="con"></p>
<hr>
<button class="ajax2">携参ajax</button>
<hr>
<input type="text" class="num1"> + <input class="num2" type="text"> = <input class="result" type="text">
<input class="cal" type="button" value="计算">
<script>
// ajax简单使用
(".ajax").click(function () { // 发送Ajax请求 .ajax({
url:"/ajax_handle/", {# 请求路径 #}
type:"get", {# 请求方式#}
success:function (res) { {# 请求成功后,执行的回调函数`#}
console.log(res);
(".con").html(res); } }) }); // ajax的携带参数访问 (".ajax2").click(function () {
// 发送Ajax请求
.ajax({ url:"/ajax_handle2/", type:"post", {# 注意要加上csrf-token,Django默认都有#} data:{ a:1, b:2, csrfmiddlewaretoken:("[name='csrfmiddlewaretoken']").val()
},
success:function (res) {
console.log(res);
}
})
});
// 携参示例
(".cal").click(function () { {# 绑定点击事件 #} let num1=(".num1").val(); {# 拿到用户输入的两个要计算的值 #}
let num2=(".num2").val(); .ajax({
url:"/cal/", {# 请求路径,可以理解为,执行视图函数的对应的路径 #}
type:"post", {# post方式发送请求 #}
data:{
num1:num1,
num2:num2,
csrfmiddlewaretoken:("[name='csrfmiddlewaretoken']").val() }, success:function (res) { {#let response=JSON.parse(res)#} {# 如果是自己手动在后端发送json字符串,要我们手动反序列化 #} {# JSON.stringify() 这个就是前端的序列化,将数据变成json #} if (res.state=="1000"){ (".result").val(res.data)
}else{
alert(res.msg)
}
}
})
});
</script>
</body>
</html>
HTML
三、案例及作业
1、登录成功跳转个人首页,失败局部刷新提示用户
login.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
<script src="/static/jquery-3.1.js"></script>
</head>
<body>
<h3>欢迎来到登录页面</h3>
{% csrf_token %}
<div class="col-md-4 col-md-offset-3">
<label for="user">账号</label>
<input type="text" id="user" placeholder="请输入您的账号" class="form-control">
</div>
<div class="col-md-4 col-md-offset-3">
<label for="pwd">密码</label>
<input type="password" id="pwd" placeholder="请输入你的密码" class="form-control">
</div>
<div class="col-md-4 col-md-offset-3">
<br>
<button class="ajax1 btn btn-default ">确认</button>
<button class="ajax2 btn btn-default ">取消</button>
<p class="con"></p>
</div>
<script>
(".ajax1").click(function () { .ajax({
url:"/login/",
type:"post",
data:{ {# 这一步发送数据给服务器 #}
user:("#user").val(), pwd:("#pwd").val(),
csrfmiddlewaretoken:("[name='csrfmiddlewaretoken']").val() {# 可以在settings文件中取消 #} }, success:function (res) { {# 服务器处理成功后,返回数据到这一步给前端 #} if (res.user) { location.href="/books/" {# 让浏览器重新发送新的页面请求,类似redirect #} }else{ {# #} (".con").html(res.msg).css("color","red"); {# 显示错误信息 #}
setTimeout(function () { {## 定时一秒后,将错误提示去掉#}
$(".con").html("")
},1000)
}
}
})
})
</script>
</body>