Ajax
# ajax:异步提交,局部刷新
Async 异步
// 1.ajax有许多版本,此次学习的位jQuery版本(无关版本,本质相同)
// 2.基本语法
$.ajax({
url:' ', // 后端地址 三种填写方式 与form标签的action一致
type:'post', // 请求方式 默认也是get
data:{'v1':v1Val, 'v2':v2Val}, // 发送的数据
success:function (args) { // 后端返回结果之后自动触发 args接收后端返回的数据
$('#d3').val(args)
}
})
# 实例展示
# 1.路由层:
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('ab_ajax/',views.ab_ajax_func)
]
# 2.配置文件
# 3.视图层
from django.shortcuts import render,HttpResponse,redirect
def ab_ajax_func(request):
if request.method == 'POST':
print(request.POST)
# return HttpResponse("ajax")
# return render(request,'abAjaxPage.html')
# return redirect('https://www.baidu.com')
v1 = request.POST.get('v1')
v2 = request.POST.get('v2')
res = int(v1) + int(v2)
return HttpResponse(res)
return render(request,'abAjaxPage.html')
# 4.模板层abAjaxPage.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.2/jquery.js"></script>
</head>
<body>
<input type="text" id="d1"> + <input type="text" id="d2"> = <input type="text" id="d3">
{#<button id="subBtn">发送ajax请求</button>#}
<script>
// 2.给按钮绑定点击事件
{#$('#subBtn').click(function(){#}
$('#d2').blur(function(){
// 1.获取两个框里的数据
let v1Val = $('#d1').val();
let v2Val = $('#d2').val();
// 3.发送ajax请求
$.ajax({
'url':'',
'type':'post',
'data':{'v1':v1Val, 'v2':v2Val },
success:function (args) {
$('#d3').val(args)
}
})
})
</script>
</body>
</html>
Content-Type
# 1.urlencoded
""" form表单默认的编码格式,也是ajax的默认编码格式"""
- 数据格式 aaa=xxx&bbb=yyy
- django后端会自动处理到request.POST中
# 2.formdata
- django后端针对普通的键值对也会处理到request.POST中
- 针对于文件则会处理到request.FILES中
"""form表单只支持上面两种,而ajax还支持其他"""
# 3.application/json
- django针对json格式数据需要后端从request.body中获取并处理
"""
print(request.body)
import json
res = json.loads(request.body)
"""
- 前端ajax代码
<script>
$('#d1').click(function () {
$.ajax({
url:'',
type:'post',
data:JSON.stringify({'name':'jason','age':18}), // 千万不要骗人家
contentType:'application/json',
success:function (args) {
alert(args)
}
})
})
</script>
ajax携带文件数据
<input type="text" id="d1">
<input type="text" id="d2">
<button id="d3">携带文件数据</button>
<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:'',
data:myFormDataObj,
// ajax发送文件固定的两个配置
contentType:false,
processData:false,
success:function (args){
alert(args)
}
})
})
</script>
回调函数args接收到的响应数据
# 1.后端request.is_ajax()
request.is_ajax() # 用于判断当前请求是不是ajax发出的
- 访问页面结果为false,点击按钮结果为true
视图层:
def ab_ajax_func(request):
print(request.is_ajax())
return render(request,'abAjaxPage.html')
前端:
<button id="d1">发送ajax请求</button>
<script>
$('#d1').click(function () {
$.ajax({
url:'',
type:'post',
data:{'name':'jason'},
success:function (args) {
console.log(args)
}
})
})
</script>
# 2.后端返回的三板斧都会被args接收,并且不会影响整个浏览器页面
# 3.选择ajax进行前后端交互时,后端一般返回的都是字典数据
- 将其转为前端能识别的json格式对象
- 方式一:
后端:
def ab_ajax_func(request):
if request.method == 'POST':
# code是自定义的状态码
user_dict = {'code':10000,'username':'喜羊羊','hobby':'吃草'}
import json
user_data = json.dumps(user_dict)
# 返回给前端是一个js格式字符串类型,容易出错,不好用可以把其封装为前端的自定义对象类型
return HttpResponse(user_data)
return render(request,'abAjaxPage.html')
前端:
<button id="d1">发送ajax请求</button>
<script>
$('#d1').click(function () {
$.ajax({
url:'',
type:'post',
data:{'name':'jason'},
success:function (args) {
let userObj = JSON.parse(args);
console.log(userObj);
console.log(typeof userObj);
console.log(userObj.username)
}
})
})
- 方式二:
后端:
from django.http import JsonResponse
def ab_ajax_func(request):
if request.method == 'POST':
# code是自定义的状态码
user_dict = {'code':10000,'username':'喜羊羊','hobby':'吃草'}
return JsonResponse(user_dict)
return render(request,'abAjaxPage.html')
前端:
<button id="d1">发送ajax请求</button>
<script>
$('#d1').click(function () {
$.ajax({
url:'',
type:'post',
data:{'name':'jason'},
success:function (args) {
console.log(args);
console.log(typeof args);
console.log(args.username)
}
})
})
</script>