Django与Ajax
目录
一、什么是Ajax
二、Ajax引入
案例
小结
三、前后端数据传输的编码格式(contentType)
【1】form表单
【2】编码格式
【3】Ajax
【4】代码演示
四、Ajax发送JSON格式数据
【1】引入
【2】后端
【3】总结
五、Ajax提交文件数据
【发送文件数据的格式】
【结论】
六、Ajax结合layer弹窗实现二次确认
七、批量插入数据
【1】项目需求
【2】解决方案
一、什么是Ajax
- AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。
- 即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)。
-
AJAX 不是新的编程语言,而是一种使用现有标准的新方法
- AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)
- AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。
- 同步交互:
- 客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
- 异步交互:
- 客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。
- 同步交互:
场景:

优点:
- 异步提交
- 局部刷新
二、Ajax引入
案例
<script>//给input框绑定一个失去焦点的事件$(".btn").click(function () {var inp1 = $("#inp1").val();var inp2 = $("#inp2").val();// 把获取到的两个值提交到后端,然后让Python来计算,然后返回//$.ajax为固定用法,表示启用ajax$.ajax({//url后面跟的是你这个ajax提交数据的路径,向谁提交,不写就是向当前路径提交 url:'', //type为标定你这个ajax请求的方法type:'post',dataType:'json',// 回调函数用来接收后端返回的数据data:{inp1:inp1, inp2:inp2},//success为回调函数,参数data即后端给你返回的数据success:function (res) {// {"username": "kevin", "password": 123}console.log(res,) // 就是拿后端返回的数据// 反序列化{#res=JSON.stringify()#}// 后端返回的数据别忘了反序列化,但是你的护短别往了序列化{#res=JSON.parse(res)#}console.log(typeof res) // 就是拿后端返回的数据console.log(res.username) // 就是拿后端返回的数据console.log(res.password) // 就是拿后端返回的数据{#$("#inp3").val(res);#}}})})
</script>def ab_ajax(request):# if request.is_ajax():if request.method=='POST':'''接收ajax提交过来的数据'''# <QueryDict: {'inp1': ['1'], 'inp2': ['1']}>print(request.POST)# d1 = request.POST.get('inp1') # str# d2 = request.POST.get('inp2') # str# d3 = int(d1) + int(d2)# 序列化import json# json.dumps(d3)user_dict = {"username":"kevin", "password":123}# return HttpResponse(json.dumps(d3))return HttpResponse(json.dumps(user_dict))# return JsonResponse(user_dict)return render(request, 'ab_ajax.html')
小结
(1)基本语法
<script>// 先给按钮绑定点击事件$('#btn').click(function () {// 向后端发送Ajax请求$.ajax({// (1)指定发送后端的请求接口url: '',// 不写就是朝当前地址发送请求// (2)请求方式type: "post", // 不指定默认就是 get 全小写// (3)提交数据data: {'i1': $('#d1').val(), 'i2': $('#d2').val()},// (4)异步提交有一个回调函数 (异步回调机制)// 当后端返回结果的时候会自动触发,args 会自动接受后端传过来的结果success: function (args) {{#alert(args)#}// 通过DOM操作动态数据渲染到第三个 input 框中console.log(args) // string$('#d3').val(args)},})})
</script>
(2)注意
- 针对后端如果是用 HttpResponse 返回的数据,回调函数不会自动帮我们反序列化
- 针对后端如果是用 JsonResponse 返回的数据,回调函数会自动帮我们反序列化
(3)HttpResponse 解决方式
- 后端先进行序列化,再返回数据给前端
- 前端加参数进行反序列化
三、前后端数据传输的编码格式(contentType)
- 我们只研究post请求方式的编码格式
- get请求方式没有编码格式且没有请求头
- 其参数直接在url地址的后面拼接着(index?useranme=&password=)
- 可以朝后端发送post请求的方式
- form请求
- ajax请求
【1】form表单
-
前后端传输数据的格式
-
urlencoded
-
formdata
-
json
-
【2】编码格式
- form表单默认的编码格式是urlencoded
- 通过查看请求头中的 Content-Type 参数
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.9,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:27
Content-Type:application/x-www-form-urlencoded
- 携带数据格式
username=22222&password=99
- Django后端针对 urlencoded 编码格式的数据会自动帮我们解析封装到 request.POST 中
- 如果编码格式改为 formdata ,那么针对普通的键值对还是解析到 request.POST 中,而其他文件格式的数据解析到 request.FILES 中
- form表单无法发送json格式数据
【3】Ajax
Accept:*/*
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.9,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:31
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
- 默认的编码格式是 urlencoded
- 数据格式
username=kevin&password=1314521
- Django后端针对 urlencoded 编码格式的数据会自动帮我们解析封装到 request.POST 中 --->
username=kevin&password=1314521
【4】代码演示
- 后端
def index(request):if request.method == 'POST':print(request.POST)print(request.FILES)return render(request, 'index.html')
- 前端HTML
<form action="" method="post" enctype="multipart/form-data"><p>username: <input type="text" name="username" class="form-control"></p><p>password: <input type="password" name="password" class="form-control"></p><p>file: <input type="file"></p><p><input type="submit" class="btn btn-success"></p><p><input type="button" class="btn btn-danger" value="按钮" id="d1"></p>
</form><script>$("#d1").click(function () {$.ajax({url: '',type: 'POST',data: {"username": "kevin", "password": 1314521},success: function (args) {},})})
</script>
四、Ajax发送JSON格式数据
前后端传输数据的时候一定要保证编码格式数据与真正的数据格式是一致的
【1】引入
- 后端
def ab_json(request):if request.method == 'POST':print(request.POST) #<QueryDict: {}>return render(request, 'ab_json.html')
- 前端
<button class="btn btn-danger" id="d1">点我</button><script>$('#d1').click(function () {$.ajax({url: '',type: 'post',// 前端数据转JSON格式数据 :JSON.stringifydata: JSON.stringify({"username": "kevin", "password": 521521}),// 不指定参数,默认就是 urlencodedcontentType: 'application/json',success: function (args) {}})})
</script>
- 请求标头携带的数据格式
- 已成功转换为JSON格式
{"username":"kevin","password":521521}
【2】后端
- 接收到的数据为空
def ab_json(request):if request.method == 'POST':print(request.POST) #<QueryDict: {}>return render(request, 'ab_json.html')
-
Django针对JSON格式的数据不会做任何处理
-
针对JSON格式的数据需要自己手动处理
-
解决办法
def ab_json(request):print(request.is_ajax()) # Trueif request.method == 'POST':print(request.POST) # <QueryDict: {}>print(request.body) # 返回的是二进制数据 :b'{"username":"dream","password":521521}'# 针对JSON格式的数据需要自己手动处理json_bytes = request.body# (1)方式一:先解码 再转换数据格式json_str = json_bytes.decode('utf-8')json_dict = json.loads(json_str)print(json_dict, type(json_dict)) # {'username': 'dream', 'password': 521521} <class 'dict'># (2)方式二:json.loads(二进制数据) 内部可以自动解码再反序列化json_dict_loads = json.loads(json_bytes)print(json_dict_loads, type(json_dict_loads)) # {'username': 'dream', 'password': 521521} <class 'dict'>return render(request, 'ab_json.html')
【补充】request方法判断ajax
request.is_ajax()
- 返回当前请求是否是ajax请求,返回布尔值
print(request.is_ajax())正常浏览器网址回车提交的是 GET 请求 - 结果是False
当我们发送ajax请求后 - 结果是True
【3】总结
- 前端在通过Ajax请求发送数据的时候,一定要注参数修改
// 不指定参数,默认就是 urlencoded
contentType: 'application/json',
- 数据是真正的JSON格式数据
发送的数据一定要符合JSON格式
或经过JSON序列化再传输
- Django后端不会帮我们处理JSON格式数据,需要自己手动处理
request.body中的数据
通过Ajax传过来的数据是二进制数据
在request.body中
要经过自己的反序列化才能拿到我们想要的数据
五、Ajax提交文件数据
-
Ajax发送文件数据需要借助js内置对象formdata
-
前端
<p>username: <input type="text" name="username" id="d1"></p>
<p>password: <input type="password" name="password" id="d2"></p>
<p>file: <input type="file" id="d3"></p><button id="btn" class="btn btn-danger">提交</button><script>// 点击按钮向后端发送普通键值对数据和文件数据$("#btn").on('click', function () {// (1)先生成一个内置对象let formDataObj = new FormData();// (2)支持添加普通的键值对formDataObj.append('username', $("#d1").val());formDataObj.append('password', $("#d2").val());// (3)支持添加文件对象 ---> 先拿到标签对象 ----> 再拿到文件对象formDataObj.append('myfile', $("#d3")[0].files[0]);// (4)基于Ajax,将文件对象发送给后端$.ajax({url: '',type: 'post',// 直接将对象放到data里面即可data: formDataObj,// Ajax发送文件必须添加的两个参数// 不需要使用任何编码 - Django后端能自动识别 formdata 对象contentType: false,// 告诉浏览器不要对我的数据进行任何处理processData: false,success: function (args) {}})})
</script>
- 后端
def ab_file(request):if request.is_ajax():if request.method == 'POST':print('POST::>>', request.POST)# 普通键值对放在了 request.POST 中# POST::>> <QueryDict: {'username': ['dream'], 'password': ['666']}>print('FILES::>>', request.FILES)# 文件数据放在了 request.FILES 中# FILES::>> <MultiValueDict: {'myfile': [<InMemoryUploadedFile: img.png (image/png)>]}>return render(request, 'ab_file.html')
【发送文件数据的格式】
// 点击按钮向后端发送普通键值对数据和文件数据
$("#btn").on('click', function () {
// (1)先生成一个内置对象
let formDataObj = new FormData();// (2)支持添加普通的键值对
formDataObj.append('username', $("#d1").val());
formDataObj.append('password', $("#d2").val());// (3)支持添加文件对象 ---> 先拿到标签对象 ----> 再拿到文件对象
formDataObj.append('myfile', $("#d3")[0].files[0]);// (4)基于Ajax,将文件对象发送给后端
$.ajax({
url: '',
type: 'post',
// 直接将对象放到data里面即可
data: formDataObj,// Ajax发送文件必须添加的两个参数
// 不需要使用任何编码 - Django后端能自动识别 formdata 对象
contentType: false,
// 告诉浏览器不要对我的数据进行任何处理
processData: false,success: function (args) {}
})
【结论】
- Ajax发送文件数据需要利用内置对象
FormData
// (1)先生成一个内置对象
let formDataObj = new FormData();// (2)支持添加普通的键值对
formDataObj.append('username', $("#d1").val());
formDataObj.append('password', $("#d2").val());// (3)支持添加文件对象 ---> 先拿到标签对象 ----> 再拿到文件对象
formDataObj.append('myfile', $("#d3")[0].files[0]);
- 需要指定两个关键性的参数
// Ajax发送文件必须添加的两个参数
// 不需要使用任何编码 - Django后端能自动识别 formdata 对象
contentType: false,
// 告诉浏览器不要对我的数据进行任何处理
processData: false,
- Django后端能直接自动识别到
FormData对象- 将内部的普通键值对自动解析并封装到
request.POST中 - 将内部的文件数据自动解析并封装到
request.FILES中
- 将内部的普通键值对自动解析并封装到
print('POST::>>', request.POST)
# 普通键值对放在了 request.POST 中
# POST::>> <QueryDict: {'username': ['dream'], 'password': ['666']}>print('FILES::>>', request.FILES)
# 文件数据放在了 request.FILES 中
# FILES::>> <MultiValueDict: {'myfile': [<InMemoryUploadedFile: img.png (image/png)>]}>
六、Ajax结合layer弹窗实现二次确认
layer 弹出层组件 - jQuery 弹出层插件
七、批量插入数据
【1】项目需求
- 项目需求:
- 浏览器中访问django后端某一条
- url(如:127.0.0.1:8080/index/)
- 实时朝数据库中生成一千条数据并将生成的数据查询出来
- 并展示到前端页面
【2】解决方案
bulk_list = []
for i in range(10000):user_obj=models.UserInfo(username='kevin%s' %i)bulk_list.append(user_obj)
# 循环之后得到了一个列表,10000个对象
# 数据库的优化, 同样的功能,不同的sql执行的效率差距很大
# 优化查询速度的时候,首先想到的是,加索引、优化sql语句,有的sql走做引、有的sql不走索引
models.UserInfo.objects.bulk_create(bulk_list)相关文章:
Django与Ajax
目录 一、什么是Ajax 二、Ajax引入 案例 小结 三、前后端数据传输的编码格式(contentType) 【1】form表单 【2】编码格式 【3】Ajax 【4】代码演示 四、Ajax发送JSON格式数据 【1】引入 【2】后端 【3】总结 五、Ajax提交文件数据 【发送文件数据的格式】 【结…...
linux日志不循环问题诊断
有一台Linux虚拟机的messages日志文件自2023年7月下旬开始没有按周为周期重新生成新的日志,一直累积在同一个messages文件中,如下所示: [root logrotate.d]# ls -l /var/log|grep me -rw-r--r-- 1 root root 107170 Nov 15 1…...
Golang版本处理Skywalking Trace上报数据
Tips: 中间记录了解决问题的过程,如不感兴趣可直接跳至结尾 首先去es里查询skywalking trace的元数据 可以拿到一串base64加密后的data_binary(直接解密不能用,会有乱码,可参考https://github.com/apache/skywalking/issues/7423) 对data_b…...
【开源】基于Vue和SpringBoot的教学过程管理系统
项目编号: S 054 ,文末获取源码。 \color{red}{项目编号:S054,文末获取源码。} 项目编号:S054,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 教师端2.2 学生端2.3 微信小程序端2…...
【python学习】中级篇-图形界面-内置库Tkinter,用于创建图形用户界面(GUI)
Tkinter是Python的一个内置库,用于创建图形用户界面(GUI)。 以下是一个简单的Tkinter用法示例: import tkinter as tkdef on_click():label.config(text"你好," entry.get())# 创建主窗口 root tk.Tk() root.title("Tkinte…...
【开源】基于JAVA的快递管理系统
项目编号: S 007 ,文末获取源码。 \color{red}{项目编号:S007,文末获取源码。} 项目编号:S007,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 快递类型模块2.3 快…...
伦敦银涨1%内银涨多少才能持平
伦敦银的价格走势是全球白银市场的价格指标,世界上其他主要的白银市场的价格走势,都是以它作为标杆并紧密的跟随。如果排除汇率的因素,伦敦银价格上涨百分之一,国内的白银价格理论上也会上涨接近的水平。 但不同市场上的白银价格&…...
Linux:进度条(小程序)以及git三板斧
Linux小程序:进度条 在实现小程序前我们要弄清楚: 1.缓冲区; 2.回车与换行。 缓冲区: 分别用gcc来编译下面两个程序: 程序一: #include <stdio.h> int main() { printf("hello Makefil…...
CSS-表格属性(1)
边框相关属性(其他元素也能用): 属性名:border-style功能:边框风格可选值: 1.none 默认值(无边框) 2.solid 实线 3.dashed 虚线 4.dotted 点线 5.double 双实线 border-style: dashed; 属性名:…...
html在线生成二维码(附源码)
文章目录 1.设计来源1.1 主界面1.2 美化功能 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/134458927 html二维码生成(附源码),生成二…...
POS系统完整体系的介绍 Pos终端主密钥MK、DUKPT、PEK、DEK、MEK、TUSN的含义 ---安全行业基础篇7
POS系统完整体系的介绍 销售点终端(POS机)是零售和服务行业中用于处理销售和交易的关键技术。POS系统不仅涉及支付处理,还包括库存管理、顾客关系管理、数据分析等多个方面。下面是POS系统完整体系的介绍: 1. 硬件组件 终端机&…...
多普勒流速仪的功能作用是什么?
我国地域广大,各地降雨分布不均,某些城市经常会出现连续的降雨进而导致城市排水压力过大,为了提高城市应对排水过量的极端情况的出现,亟需一种方案能够对城市排水进行有效及时的监测,从而能够及时的采取应对方案。 在污…...
java 数据库 查询 select 2
Day2 组函数 以组为操作单位,一组数据得到一个结果。 在没有手动分组的前提下,整张表默认为一组数据 max(列名):获取最大值 min(列名):获取最小值 sum(列名):获取总和 avg(列名):获取平均值 count(列…...
【前端学java】复习巩固-Java中的对象比较(14)
往期回顾: 【前端学java】JAVA开发的依赖安装与环境配置 (0)【前端学 java】java的基础语法(1)【前端学java】JAVA中的packge与import(2)【前端学java】面向对象编程基础-类的使用 (…...
Sentinel 系统规则 (SystemRule)
Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 SpringbootDubboNacos 集成 Sentinel&…...
Linux:详解(yum的使用、vim编辑器命令集合以及gcc/g++编译器的使用)
Linux 软件包管理器 yum 什么是软件包: 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通…...
剧情继续:马斯克曝出OpenAI前员工举报信,董事会与奥特曼谈判回归
丰色 发自 凹非寺 量子位 | 公众号QbitAI 经过4天的极限拉扯、反转再反转,奥特曼有可能重新回归了。 据知情人士透露,OpenAI董事会正与奥特曼进行一场“富有成效”的新谈判。 如果奥特曼回到OpenAI,他将继续担任CEO。 与此同时,…...
mysql解压版安装步骤linux
1. MySQL下载就不说了,以5.7版本举例 2. 解压安装包 tar -zxvf mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz 3. 重命名目录 mv mysql-5.7.41-linux-glibc2.12-x86_64 /usr/local/mysql 4. 创建mysql用户组和用户 groupadd mysql useradd -r -g mysql mysql …...
Program Header Table(转载)
程序头表与段表相互独立,由ELF文件头统一管理。 程序头表负责ELF文件从文件到加载后映像的映射关系,一般只有可执行文件包含。 1. segment和section segment: 程序头表项描述的对象称为segment,即elf文件加载后的数据块; 它提供…...
汽车智能座舱/智能驾驶SOC -2
第二篇(笔记)。 未来智能汽车电子电气将会是集中式架构(车载数据中心)虚拟化技术(提供车载数据中心灵活性和安全性)这个几乎是毋庸置疑的了。国际大厂也否纷纷布局超算芯片和车载数据中心平台。但是演进需…...
终极指南:5分钟掌握《全面战争》模组制作神器RPFM
终极指南:5分钟掌握《全面战争》模组制作神器RPFM 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: https://gitcode…...
终极React-Redux开源贡献指南:从新手到贡献者的完整路径
终极React-Redux开源贡献指南:从新手到贡献者的完整路径 【免费下载链接】react-redux Official React bindings for Redux 项目地址: https://gitcode.com/gh_mirrors/re/react-redux React-Redux作为React官方推荐的Redux绑定库,是现代前端开发…...
告别重复劳动!用Python的PyAutoGUI库打造你的专属自动化脚本(附完整代码)
用Python解放双手:PyAutoGUI实战指南 每天重复点击相同的按钮、填写相同的表格、执行相同的操作——这些机械性工作正在吞噬你的时间和创造力。作为一名Python开发者,你完全可以用PyAutoGUI这个神奇的库把这些枯燥任务交给计算机自动完成。本文将带你从零…...
从Tomcat到Redis:用Vulfocus编排一个多层内网靶场,复盘真实渗透路径
从Tomcat到Redis:构建多层内网靶场的渗透实战指南 在网络安全领域,靶场环境的重要性不亚于真实战场上的演习场。一个精心设计的靶场能够模拟复杂的企业内网环境,让安全从业者在零风险的情况下磨练渗透测试技能。本文将带你深入探索如何利用Vu…...
【仅限首批200家认证ISV开放】:MCP 2026动态管控配置黄金参数矩阵——覆盖金融/医疗/政务三大高敏场景
更多请点击: https://intelliparadigm.com 第一章:MCP 2026动态管控配置体系的演进逻辑与战略定位 MCP(Multi-layered Configuration Protocol)2026 是面向云原生与边缘协同场景构建的新一代动态配置治理框架。其核心演进逻辑并非…...
OpenCodeUI:基于React的现代化AI应用前端框架开发指南
1. 项目概述:当开源大模型遇上现代UI设计最近在折腾AI应用开发的朋友,估计都绕不开一个核心痛点:如何快速、优雅地给大语言模型(LLM)套上一个好用又好看的“壳”。自己从零开始写前端?时间成本太高…...
SkillSwitch:基于Tauri 2的AI编程助手Skill管理工具开发全解析
1. 项目概述与核心价值 如果你和我一样,日常重度依赖 Claude Code、Cursor 这类 AI 编程助手,那你一定遇到过这个痛点:Skill(或者说 Agent、指令集)越来越多,管理起来却一团糟。它们散落在各个应用的配置目…...
20个Illustrator脚本:从设计新手到效率大师的终极指南
20个Illustrator脚本:从设计新手到效率大师的终极指南 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 还在为Adobe Illustrator中那些重复枯燥的操作而烦恼吗࿱…...
Unity Timeline实战:用自定义对话轨道打造电影级游戏过场动画(附完整资源)
Unity Timeline实战:用自定义对话轨道打造电影级游戏过场动画(附完整资源) 在《巫师3》的凯尔莫罕雪夜对话中,杰洛特与叶奈法的眼神交错配合台词节奏的微妙停顿,让玩家仿佛置身于真实的电影场景。这种沉浸式叙事体验的…...
构建企业级.NET代码编辑器:ScintillaNET终极架构解析
构建企业级.NET代码编辑器:ScintillaNET终极架构解析 【免费下载链接】ScintillaNET A Windows Forms control, wrapper, and bindings for the Scintilla text editor. 项目地址: https://gitcode.com/gh_mirrors/sc/ScintillaNET 在.NET桌面应用开发领域&a…...
