AJAX

什么是AJAX

AJAX 就是在不需要重新加载整个页面,就可以与后端异步交互数据,提交并更新部分网页内容。

AJAX与FORM表单区别

Ajax提交数据页面不用刷新原始数据还在,处理数据的过程中不影响页面其他操作

Form表单提交数据页面刷新,原始数据不在并且处理数据的过程中无法做其他操作

示例1

页面输入两个整数,通过AJAX传输到后端计算出结果并返回。

index.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  7. </head>
  8. <body>
  9. <input type="text" id="num1">+<input type="text" id="num2">=<input type="text" id="num3">
  10. <button id="btn">计算</button>
  11. </body>
  12. <script>
  13. $('#btn').click(function () {
  14. // 获取两个框内的数据
  15. let num1Val = $('#num1').val();
  16. let num2Val = $('#num2').val();
  17. // 发送ajax请求传输数据
  18. $.ajax({
  19. url: '', // 不写默认就是当前页面所在地址
  20. type: 'post', // 指定当前请求方式
  21. data: {
  22. 'num1': num1Val,
  23. 'num2': num2Val,
  24. }, // 请求携带的数据
  25. success: function (args) { // 异步回调函数,后端有回复自动触发
  26. $('#num3').val(args)
  27. }
  28. })
  29. })
  30. </script>
  31. </html>

view.py

  1. from django.shortcuts import render, HttpResponse, redirect
  2. from django.views.decorators.csrf import csrf_exempt
  3. @csrf_exempt
  4. def index(request):
  5. print(request.is_ajax())
  6. if request.is_ajax(): # 判断是否是ajax请求
  7. if request.method == 'POST':
  8. num1 = request.POST.get('num1')
  9. num2 = request.POST.get('num2')
  10. res = int(num1) + int(num2)
  11. return HttpResponse(res)
  12. return render(request, 'index.html', locals())

示例2

当用户填写了用户名后,把光标移开后,会自动向服务器发送异步请求。服务器返回这个用户名是否已经被注册过。

index.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  7. </head>
  8. <body>
  9. 用户名:<input type="text" id="username"><span style="color: red"></span>
  10. </body>
  11. <script>
  12. $('#username').onblur('input', function () {
  13. $.ajax({
  14. url: '', // 不写默认就是当前页面所在地址
  15. type: 'post', // 指定当前请求方式
  16. data: {
  17. 'username': $(this).val(),
  18. }, // 请求携带的数据
  19. success: function (args) { // 异步回调函数,后端有回复自动触发
  20. $('span').text(args)
  21. },
  22. })
  23. })
  24. </script>
  25. </html>

view.py

  1. from django.shortcuts import render, HttpResponse, redirect
  2. from django.views.decorators.csrf import csrf_exempt
  3. @csrf_exempt
  4. def index(request):
  5. name_list = ['kevin', 'jerry', 'tom']
  6. if request.is_ajax(): # 判断是否是ajax请求
  7. if request.method == 'POST':
  8. name = request.POST.get('username')
  9. if name in name_list:
  10. return HttpResponse("用户已经存在")
  11. else:
  12. return HttpResponse('')
  13. return render(request, 'index.html', locals())

前后端传输数据编码格式

Django针对不同编码方式对应的数据格式会采用不同的处理策略

Django之AJAX - 图1

form表单默认发送的编码格式

  1. Content-Type: application/x-www-form-urlencoded

数据格式:username=kevin&password=admin123

Django后端会自动处理到:request.POST

form表单发送文件的编码格式(需要在form表单添加**entype="multipart/form-data"**

  1. Content-Type: multipart/form-data

数据格式:隐藏看不到

Django后端会自动处理:request.POST request.FILES

Ajax默认的编码格式

  1. Content-Type: application/x-www-form-urlencoded

数据格式:username=kevin&password=admin123

Django后端会自动处理到:request.POST

回调机制处理策略

使用Ajax交互所有的操作都不再直接影响整个页面(局部操作)返回的一定是HttpResponse

Ajax发送json格式数据

index.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  7. </head>
  8. <body>
  9. <button id="btn">发生json格式数据</button>
  10. </body>
  11. <script>
  12. $('#btn').click(function (){
  13. $.ajax({
  14. url:'',
  15. type:'post', // 不写默认get请求
  16. contentType:'application/json', // 不写默认是urlencoded编码
  17. data:JSON.stringify({'name':'kevin','pwd':'admin123'}), // 序列化方法
  18. success:function (arg){
  19. }
  20. })
  21. })
  22. </script>
  23. </html>

view.py

  1. from django.shortcuts import render, HttpResponse, redirect
  2. from django.views.decorators.csrf import csrf_exempt
  3. @csrf_exempt
  4. def index(request):
  5. if request.is_ajax():
  6. if request.method == 'POST':
  7. import json
  8. json_dict = json.loads(request.body) # json.loads方法自带解析功能
  9. print(json_dict)
  10. return render(request, 'index.html', locals())

补充

  1. Ajax发送的数据类型一定要跟数据的编码格式一致
  2. Django后端对json格式的数据在request.body,并不会做任何处理,需要自行处理
  3. form表单无法发送json格式数据的!!!

Ajax携带文件数据

index.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  7. </head>
  8. <body>
  9. <input type="text" id="name">
  10. <input type="file" id="file">
  11. <button id="btn">发送Ajax请求</button>
  12. </body>
  13. <script>
  14. $('#btn').click(function () {
  15. // 利用js内置对象FormData
  16. let myFormData = new FormData();
  17. // 对象添加普通数据
  18. myFormData.append('username', $('#name').val())
  19. // 对象添加文件数据
  20. myFormData.append('my_file', $('#file')[0].files[0])
  21. // 发送ajax请求
  22. $.ajax({
  23. url: '',
  24. type: 'post',
  25. data: myFormData,
  26. // 携带文件必须要指定的两个参数
  27. contentType: false,
  28. processData: false,
  29. success:function (arg){
  30. // 处理异步回调返回的结果
  31. }
  32. })
  33. })
  34. </script>
  35. </html>

view.py

  1. from django.shortcuts import render, HttpResponse, redirect
  2. from django.views.decorators.csrf import csrf_exempt
  3. @csrf_exempt
  4. def index(request):
  5. if request.is_ajax():
  6. if request.method == 'POST':
  7. username = request.POST.get('username')
  8. file = request.FILES.get('my_file')
  9. with open(f'{username}_{file.name}', 'wb') as f:
  10. for line in file:
  11. f.write(line)
  12. return render(request, 'index.html', locals())