Django框架之Ajax进阶

一、前后端传输数据的编码格式(contentType)

此内容主要是研究post请求数据的编码格式,因为get请求数据就是直接放在url后面的。

首先我们在前面叙述过可以朝后端发送post请求的方式有

  • form表单
  • Ajax

然后现在又了解到前后端传输数据的编码格式有

  • urlencoded
  • formdata
  • json

1、研究form表单

(1)前端格式展示

<form action="" method="post" enctype="text/plain"></form>
<form action="" method="post" enctype="application/x-www-form-urlencoded"></form>
<form action="" method="post" enctype="multipart/form-data"></form>

(2)编码格式

form表单默认的编码格式urlencoded,通过查看请求头中的 Content-Type 参数可以看出。

携带的数据格式:

username=xiao&password=123

django对urlencoded的处理:

 django后端针对符合urlencoded编码格式的数据都会自动帮你解析封装到request.POST中

django后端获取数据的模样:

<QueryDict: {'username': ['xiao'], 'password': ['123'], 'file': ['1755041963.jpg']}>

注意:

  1. 只要数据格式都是username=&password=&file=xxx.png ==> request.POST
  2. 如果你把编码格式改成formdata,那么针对普通的键值对还是解析到request.POST中,而文件将解析到request.FILES中。
  3. form表单是没办法发送json格式数据的

2、研究Ajax

Ajax默认的数据编码格式是urlencoded,通过查看请求头中的 Content-Type 参数可以看出。
携带的数据格式:

username=xiao&password=123

django对urlencoded的处理:

 django后端针对符合urlencoded编码格式的数据都会自动帮你解析封装到request.POST中

django后端获取数据的模样:

<QueryDict: {'username': ['xiao'], 'password': ['123'], 'file': ['1755041963.jpg']}>

注意:

只要数据格式都是username=&password=&file=xxx.png ==>request.POST

3、示例

(1)后端

def index(request):if request.method == 'POST':print(request.POST)# <QueryDict: {'username': ['dream'], 'password': ['1314521']}>print(request.FILES)# <MultiValueDict: {'img_file': [<InMemoryUploadedFile: 作用域链.drawio.png (image/png)>]}>return render(request, 'index.html')

(2)前端

<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": "dream", "password": 1314521},success: function (args) {},})})
</script>

ps:补充QueryDict

a. 本质上继承了原生的dict
b. 字典能干的他都可以,字典不能干的,他基本上都不行
c. 就把他当成普通字典使用即可,中括号取值/赋值,get取值

二、ajax发送json格式数据

大前提:前后端传输数据的时候一定要确保编码格式跟数据真正的格式是一致的

(1)前端

在前端,将数据封装为json格式JSON.stringify(数据),并指定编码格式contentType: 'application/json'

<button class="btn btn-danger" id="d1">点我</button><script>$('#d1').click(function () {$.ajax({url: '',type: 'post',// 前端数据转JSON格式数据 :JSON.stringifydata: JSON.stringify({"username": "dream", "password": 521521}),// 不指定参数,默认就是 urlencodedcontentType: 'application/json',success: function (args) {}})})
</script>

发送的数据格式为:{“username”:“xiao”,“age”:18}

request.POST不会接收json格式的数据,django后端也不会对json格式的数据做进一步处理。

request.body可以用于接收json格式的数据,直接得到的是二进制格式的数据,需要在后端手动处理(解码+反序列化)

(2)后端

def ab_json(request):if request.is_ajax():# 针对json格式数据需要你自己手动处理json_bytes = request.body# (1)方式一:先解码 再转换数据格式json_str = json_bytes.decode('utf8')json_dict = json.loads(json_str)print(json_dict, type(json_dict)) # {'username': 'xiao', 'age': 18} <class 'dict'># (2)方式二:json.loads括号内如果传入了一个二进制格式的数据,那么内部会自动解码再反序列化json_dict = json.loads(json_bytes) print(json_dict,type(json_dict))  # {'username': 'xiao', 'age': 18} <class 'dict'>return render(request,'02 ab_json.html')

(3)注意点

  • contentType参数指定成:application/json
  • 数据必须是真正的json格式数据
  • django后端不会帮你处理json格式数据,需要你自己去request.body获取并处理

(4) Ajax发送json格式数据总结

  • 前端:将数据封装为json格式;
  • 前端:指定编码格式:contentType: 'application/json'
  • 后端:手动处理json格式数据,对request.body接收的二进制数据进行处理:解码 + 反序列化。

三、ajax发送文件数据

大前提:ajax发送文件需要借助于js内置对象FormData

(1)前端

<p>username:<input type="text" name="username" id="d1"></p>
<p>password:<input type="password" name="password" id="d2"></p>
<p><input type="file" id="d3"></p>
<button id="d4" class="btn btn-success">点我</button><script>// 点击按钮后端发送普通键值对和文件数量$("#d4").on('click', function () {// 1.需要先利用FormData内置对象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: formDataObj,  // 直接将对象放在data后面即可// ajax发送文件必须要指定的两个参数contentType: false,// 不需要使用任何编码,django后端能够自动识别formdata对象processData: false,// 告诉你的浏览器不要对你的数据进行任何处理success: function (args) {}})})
</script>

(2)后端

def ab_file(request):if request.is_ajax():if request.method == 'POST':print('POST::>>', request.POST)# 普通键值对放在了  request.POST   中# POST::>> <QueryDict: {'username': ['quandsb'], 'password': ['111']}>print('FILES::>>', request.FILES)# 文件数据放在了  request.FILES   中# FILES::>> <MultiValueDict: {'myfile': [<InMemoryUploadedFile: MySQL6.png (image/png)>]}>return render(request, 'ab_file.html')"""
个人理解:
request.POST:丰巢,一格一格的数据
request.FILES:菜鸟驿站,可取大件
request.body:传达室,自取自拿,一整个二进制数据
"""

(3)总结

  • 需要利用内置对象FormData
  • 添加普通的键值对
    • formDateObj.append('username', $('#d1').val());
    • formDateObj.append('password', $('#d2').val());
  • 添加文件对象
    • formDateObj.append('myfile', $('#d3')[0].files[0])
  • 需要指定两个关键性的参数
    • contentType:false, // 不需要使用任何编码,django后端能够自动识别formdata对象
    • processDate:false, // 告诉你的浏览器不要对你的数据进行任何处理
  • django后端能够直接识别到formdata对象并且能够将内部的普通键值对自动解析并封装到request.POST中,文件数据自动解析并封装到request.FILES中

四、补充request方法判断ajax

request.is_ajax()
  • 返回当前请求是否是ajax请求,返回布尔值
print(request.is_ajax())# 正常浏览器网址回车提交的是 GET 请求 - 结果是False
# 当我们发送ajax请求后 - 结果是True

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/9232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

啰嗦一下开发语言

这次不发版了&#xff0c;直接啰嗦一下吧 MySQL Binlog Digger 4.33这个版本一直迟迟没有推出&#xff0c;因为原来用Python写的版本已经没有多少优化的空间了&#xff0c;而号称性能强劲的Python 3.13官方一直没发版。 Python编写效率高是人所共知&#xff0c;但Python执行效…

ASP.NET信息安全研究所设备管理系统的设计与实现

摘 要 以研究所的设备管理系统为背景&#xff0c;以研究所设备管理模式为研究对象&#xff0c;开发了设备管理系统。设备管理系统是设备管理与计算机技术相结合的产物&#xff0c;根据系统的功能需求分析与定义的数据模式&#xff0c;分析了应用程序的主要功能和系统实现的主…

zabbix动作执行命令失效不起作用?

1. zabbix在web界面设置完主机组&#xff0c;主机&#xff0c;监控项&#xff0c;触发器&#xff0c;动作之后 监控项监控到了&#xff0c;触发器触发动作&#xff0c;但是执行的指令不起作用 流程 在zabbix-agent端将nginx服务down掉&#xff0c;zabbix会自动监控并执行重启的…

TypeScript学习日志-第二十一天(声明文件d.ts)

声明文件d.ts 在使用 Typescript 并使用第三方库 的时候 我们会发现会有很多的提示或补全&#xff0c;这都是声明文件起的作用&#xff0c;但是有写冷门的第三方库是没有声明文件的&#xff0c;这时候引用就会报错&#xff0c;我们就使用 express 库作为例子来展示一下&#x…

CMake创建跨平台OPenGL工程(学习笔记)

一、跨平台环境基本配置 1、环境搭建 1&#xff09;linux OpenGL环境搭建参考&#xff1a;ubuntu18.04 OpenGL开发&#xff08;显示YUV&#xff09;_ubuntu opengl-CSDN博客 https://blog.51cto.com/cerana/6433535 2&#xff09;windows下环境搭建 OpenGLVisual Studio20…

SDUT java lab7.4

7-4 sdut-JAVA-Vowel And Consonant Count 分数 6 全屏浏览 切换布局 作者 马新娟 单位 山东理工大学 You are required to write a Java application program that accepts a word from the user and outputs the total numbers of vowels and the total number of conson…

【Linux系统】进程控制

再次理解进程 进程&#xff1a;内核的相关管理数据结构(task_struct(进程控制块PCB)&#xff0c;mm_struct(地址空间)&#xff0c;页表) 代码和数据 那么如何理解进程具有独立性&#xff1f; 我们之前已经学习过进程控制块啊&#xff0c;地址空间啊&#xff0c;页表啊&…

GitHub Actions 手动触发方式

目录 前言 Star Webhook 手动触发按钮 前言 GitHub Actions 是 Microsoft 收购 GitHub 后推荐的一款 CI/​CD 工具早期可能是处于初级开发阶段&#xff0c;它的功能非常原生&#xff0c;甚至没有直接提供一个手动触发按钮一般的触发方式为代码变动&#xff08;push 、pull…

【2024版】最新6款漏洞扫描工具来了!(附下载)看完这一篇就够了

目录 一、Nessus 二、AWVS 三、ZAP 四、w3af 五、北极熊 六、御剑 七、网络安全学习路线 &#xff08;2024最新整理&#xff09; 八、学习资料的推荐 1.视频教程 2.SRC技术文档&PDF书籍 3.大厂面试题 特别声明&#xff1a; 渗透测试收集信息完成后&#xf…

每日两题 / 104. 二叉树的最大深度 102. 二叉树的层序遍历(LeetCode热题100)

104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 递归判断&#xff0c;当前节点的最大深度为1 max(左节点的最大深度&#xff0c;右节点的最大深度) /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …

Ansible---inventory 主机清单

一、inventory 主机清单 1.1、inventory介绍 hosts配置文件位置&#xff1a;/etc/ansible/hosts Inventory支持对主机进行分组&#xff0c;每个组内可以定义多个主机&#xff0c;每个主机都可以定义在任何一个或多个主机组内。 1.2、inventory中的变量 Inventory变量名含义…

八、VUE内置指令

一、初识VUE 二、再识VUE-MVVM 三、VUE数据代理 四、VUE事件处理 五、VUE计算属性 六、Vue监视属性 七、VUE过滤器 七、VUE内置指令 九、VUE组件 v-text 向其所在的节点中渲染文本内容。 (纯文本渲染)与插值语法的区别&#xff1a;v-text会替换掉节点中的内容&#xff0c;{{x…

2024OD机试卷-小华地图寻宝 (java\python\c++)

题目:小华地图寻宝 题目描述 小华按照地图去寻宝,地图上被划分成 m 行和 n 列的方格,横纵坐标范围分别是 [0, n-1] 和 [0, m-1]。 在横坐标和纵坐标的数位之和不大于 k 的方格中存在黄金(每个方格中仅存在一克黄金),但横坐标和纵坐标之和大于 k 的方格存在危险不可进入…

springboot3项目练习详细步骤(第一部分:用户业务模块)

目录 环境准备 用户模块 注册 注册接口文档 ​编辑 实现结构 Spring Validation 登录 登录的接口文档 实现登录逻辑 JWT令牌 完善登录认证 拦截器 获取用户详细信息 接口文档 Usercontroller类中编写方法接口 忽略属性返回 优化代码ThreadLocal 更新用户基本信…

汉译英早操练-(二十八)

hello&#xff0c;汉语在表达成英语的时候你是否有困惑。不要着急&#xff0c;一起来看看需要我们注意一些什么&#xff0c;慢慢的就不恐惧用英语表达汉语这件事了。给大家奉献系列文章&#xff0c;供大家参考学习。 往期回顾在这里&#xff0c;请随便点击过去查看&#xff0c;…

ubuntu启动修复(BIOS无法找到GRUB | 引导加载器)

Ubuntu启动修复&#xff08;无法找到GRUB|引导加载器&#xff09; 问题&#xff1a; 笔者的一台双系统主机&#xff0c;里面有两个硬盘&#xff0c;1T的硬盘装的是windows系统&#xff0c;2T硬盘装的是ubuntu20.04系统。因为长期使用ubuntu系统&#xff0c;所以选择格式化了1T…

create-react-app完整配置别名alias方法

在使用 create-react-app 创建的项目中配置路径别名&#xff0c;可以使用 react-app-rewired 这个库来覆盖 create-react-app 的默认配置。以下是配置步骤和示例&#xff1a; 在项目根目录中安装 react-app-rewired&#xff1a; npm install react-app-rewired --save-dev 在…

Adobe Premiere Pro安装

一、安装包下载 链接&#xff1a;https://pan.baidu.com/s/1aYqTSQQutDguKYZE-yNHiw?pwd72l8 提取码&#xff1a;72l8 二、安装步骤 1.鼠标右击【Pr2024(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 Pr2024(64bit)】。 2.打开…

【计算机毕设】小型企业办公自动化系统+vue - 免费源码(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 本项目旨在设计并实现一个小型企业办公自动化系统&#xff0c;利用Vue作为前端框架&#xff0c;为企业员工提供便捷的办公管理工具&#xff0c;提升…

mysql数据库调优篇章1

目录 1.认识数据库中日志的作用2.增加mysql数据库中my.ini 基本配置3.增加my.ini中参数配置4.查看已经执行过的sql语句过去执行时间5.找出慢查询的sql6. SHOW VARIABLES LIKE ‘innodb_read_io_threads’; SHOW VARIABLES LIKE ‘innodb_write_io_threads’; SHOW VARIABLES LI…