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.stringify
            data: JSON.stringify({"username": "dream", "password": 521521}),
            // 不指定参数,默认就是 urlencoded
            contentType: '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.mfbz.cn/a/607970.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++反汇编,指针和内存分配细节,面试题05

文章目录 20. 指针 vs 引用21. new vs malloc 20. 指针 vs 引用 指针是实体&#xff0c;占用内存空间&#xff0c;逻辑上独立&#xff1b;引用是别名&#xff0c;与变量共享内存空间&#xff0c;逻辑上不独立。指针定义时可以不初始化&#xff1b;引用定义时必须初始化。指针的…

通过MediaPipe+MiDaS实现人脸单目测距

MediaPipe&#xff1a;是Google开发的适用于直播和流媒体的开源、跨平台、可定制的机器学习解决方案。code地址&#xff1a;https://github.com/google/mediapipe &#xff0c;最新发布版本v0.10.11&#xff0c;license为Apache-2.0。MediaPipe Solutions提供了一套库和工具&am…

【Linux网络】HTTPS【上】{运营商劫持/加密方式/数据摘要/https的诞生}

文章目录 1.引入1.1http与https1.2SSL/TLS1.3VPN1.4认识1.5密码学1.6为什么要加密&#xff1f;运营商 1.7常见的加密方式对称加密非对称加密 2.加密与解密3.数据摘要 && 数据指纹MD5 数字 签名理解三者数据摘要&#xff08;Digital Digest&#xff09;&#xff1a;数字…

数据结构与算法之树和二叉树的一些概念和性质

目录 前言 一、树的定义 二、树的若干术语 1.结点的度 2.叶子 3.双亲与孩子 4.兄弟 5.祖先 6.树的度 7.结点的层次 8.树的深度 9.有序树和无序树 10.森林 三、树的逻辑结构 四、树的存储结构 1.顺序存储 2.链式存储 五、二叉树 1.定义 2.二叉树的五种状态 …

美食推荐网站设计

**中文摘要&#xff1a;**在当今信息化、网络化的时代背景下&#xff0c;美食文化正逐渐融入人们的日常生活&#xff0c;而网络平台成为人们获取美食信息、分享美食体验的重要途径。为了满足广大美食爱好者对美食信息的探索和推荐需求&#xff0c;本文提出了一种创新的美食推荐…

OS复习笔记ch5-3

引言 上一节我们学习了关于信号量机制的一些内容&#xff0c;包括信号量的含义&#xff0c;对应的PV操作等。 如图所示&#xff0c;上一节主要是针对信号量的互斥&#xff0c;其实信号量机制还可以做很多事情&#xff0c;比如实现进程同步和前驱关系&#xff0c;这一节我们先复…

Selenium 自动化 —— 常用的定位器(Locator)

什么是定位器 定位器&#xff08;Locator&#xff09;是识别DOM中一个或多个特定元素的方法。 也可以叫选择器 Selenium 通过By类&#xff0c;提供了常见的定位器。具体语法如下&#xff1a; By.xxx("");我们选择单个元素时可以使用findByElement&#xff1a; Web…

ICode国际青少年编程竞赛- Python-2级训练场-坐标与列表练习

ICode国际青少年编程竞赛- Python-2级训练场-坐标与列表练习 1、 for i in range(6):Spaceship.step(Item[i].x - Spaceship.x)Dev.step(Item[i].y - Dev.y)Dev.step(Spaceship.y - Dev.y)2、 for i in range(5):Spaceship.step(Item[i].x - Spaceship.x)Flyer[i].step(Item[…

【MySQL数据库开发设计规范】之基础规范

欢迎点开这篇文章&#xff0c;自我介绍一下哈&#xff0c;本人笔名姑苏老陈&#xff0c;是一个JAVA开发老兵。 本文收录于 《MySQL数据库开发设计规范》专栏中&#xff0c;该专栏主要分享一些关于MySQL数据库开发设计相关的技术规范文章&#xff0c;定期更新&#xff0c;欢迎关…

《ESP8266通信指南》11-Lua开发环境配置

往期 《ESP8266通信指南》10-MQTT通信&#xff08;Arduino开发&#xff09;-CSDN博客 《ESP8266通信指南》9-TCP通信&#xff08;Arudino开发&#xff09;-CSDN博客 《ESP8266通信指南》8-连接WIFI&#xff08;Arduino开发&#xff09;&#xff08;非常简单&#xff09;-CSD…

机器学习(三) ----------线性回归算法(梯度下降+正则化)

目录 1 定义 2 损失函数&#xff08;回归&#xff09; 2.1 最小二乘函数&#xff08;Least Squares Function&#xff09; 2.2 均方误差&#xff08;Mean Squared Error, MSE&#xff09; 2.3 均方根误差&#xff08;Root Mean Squared Error, RMSE&#xff09; 2.4 平均绝…

自动驾驶纵向控制算法

本文来源——b站忠厚老实的老王&#xff0c;链接&#xff1a;忠厚老实的老王投稿视频-忠厚老实的老王视频分享-哔哩哔哩视频 (bilibili.com)&#xff0c;侵删。 功率和转速之间的关系就是&#xff1a;功率P等于转矩M乘以转速ω。并不是油门越大加速度就越大。 发动机和电机的转…

GDAL:Warning 1: All options related to creation ignored in update mode

01 警告说明 首先贴出相关代码&#xff1a; out_file_name Rs_{:4.0f}{:02.0f}.tiff.format(year, month) out_path os.path.join(out_dir, out_file_name) mem_driver gdal.GetDriverByName(MEM) mem_ds mem_driver.Create(, len(lon), len(lat), 1, gdal.GDT_Float32) …

掌握用户全生命周期数据,Xinstall让App投放更科学

在数字化时代&#xff0c;App已成为企业与用户互动的重要窗口。然而&#xff0c;想要让App在众多竞争者中脱颖而出&#xff0c;吸引并留住用户&#xff0c;有效的广告投放策略至关重要。这就需要对广告投放效果进行精准分析&#xff0c;以便及时调整策略&#xff0c;实现最大化…

Kubernetes的基本概念

目录 一.基本内容 1.定义 2.作用 二.特性 1.弹性伸缩 2.自我修复 3.服务发现和负载均衡 4.自动发布&#xff08;默认滚动发布模式&#xff09;和回滚 5.集中化配置管理和密钥管理 6.存储编排&#xff0c;支持外挂存储并对外挂存储资源进行编排 7.任务批处理运行 三…

clickhouse mergeTree表引擎解析

参照 https://clickhouse.com/docs/zh/engines/table-engines/mergetree-family/mergetree https://clickhouse.com/docs/en/optimize/skipping-indexes Clickhouse中最强大的表引擎当属MergeTree&#xff08;合并树&#xff09;引擎及该系列&#xff08;*MergeTree&#xff…

Springboot项目使用redis实现session共享

1.安装redis&#xff0c;并配置密码 这里就不针对于redis的安装约配置进行说明了&#xff0c;直接在项目中使用。 redis在windows环境下安装&#xff1a;Window下Redis的安装和部署详细图文教程&#xff08;Redis的安装和可视化工具的使用&#xff09;_redis安装-CSDN博客 2…

图片公式识别@文档公式识别@表格识别@在线和离线OCR工具

文章目录 abstract普通文字识别本地软件识别公式扩展插件下载小结 在线识别网站/API&#x1f47a;Quicker整合(推荐)可视化编辑和识别公式其他多模态大模型识别图片中的公式排版 开源模型 abstract 本文介绍免费图片文本识别(OCR)工具,包括普通文字识别,公式识别,甚至是手写公…

Linux网络——自定义序列化与反序列化

前言 之前我们学习过socket之tcp通信&#xff0c;知道了使用tcp建立连接的一系列操作&#xff0c;并通过write与read函数能让客户端与服务端进行通信&#xff0c;但是tcp是面向字节流的&#xff0c;有可能我们write时只写入了部分数据&#xff0c;此时另一端就来read了&#x…

ZYNQ MPSoC zcu102 PS端运行helloworld

文章目录 一、参考资料二、需要注意的步骤三、运行结果 一、参考资料 1.zcu102 zynq Mpsoc uart hello world——CSDN博客 2.zcu102自学 —— 第一个实验 &#xff08;纯PS 串口打印 Hello world&#xff09;——CSDN博客 3.【02】ALINX Zynq MPSoC XILINX FPGA视频教程 SDK 裸…
最新文章