首页 > 其他分享 >Ajax和django自带序列化组件

Ajax和django自带序列化组件

时间:2024-03-28 20:02:37浏览次数:21  
标签:val request number django Ajax result 序列化 data user

Ajax和django自带序列化组件

1.Ajax

1.1 Ajax介绍

  • AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。
    • 即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。
  • AJAX 不是新的编程语言,而是一种使用现有标准的新方法。
  • AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)
  • AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。
    • 同步交互:
      • 客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
    • 异步交互:
      • 客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。

1.2 发送请求方式

  • 向后端发送请求的方式
    • 浏览器地址直接url回车
      • GET请求
    • a标签的 href 属性
      • GET请求
    • form表单
      • GET请求/POST请求
    • Ajax
      • GET请求/POST请求

1.3 Ajax案例

  • 页面上有两个 input 框
  • 在第一个input框中输入数字,在第二个框中也输入数字
  • 计算结果渲染到第三个框中
1.3.1 JS实现
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div>number_one : <input type="text" id="number1"></div>
<div>number_two : <input type="text" id="number2"></div>
<div>result : <input type="text" id="result"></div>
<button id="btn_result">点我计算结果</button>
<script>
    $(document).ready(
        $("#btn_result").click(function () {
            let numberOne = $("#number1").val();
            let numberTwo = $("#number2").val();
            let result = parseInt(numberOne) + parseInt(numberTwo)
            $("#result").val(result)
        })
    )


</script>
</body>
</html>
1.3.2 Ajax基础实现
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div>number_one : <input type="text" id="number1"></div>
<div>number_two : <input type="text" id="number2"></div>
<div>result : <input type="text" id="result"></div>
<button id="btn_result">点我计算结果</button>
<script>

    $(document).ready(
        $("#btn_result").click(function () {
            let numberOne = $("#number1").val();
            let numberTwo = $("#number2").val();
            // 基于Ajax发送请求
            $.ajax({
                // 参数 url : 指定当前数据提交的网址,如果不写 form表单的action是一样,默认释放前路由地址
                url: "",
                // type : 请求类型 GET / POST  ,默认是get
                type: "post",
                // data : 自己携带数据 ,做成字典的格式传输数据
                data: {'number_one': numberOne, "number_two": numberTwo},
                // success : 回调函数 , 负责接收到后端返回的数据
                success: function (data) {
                    console.log(data)
                    $("#result").val(data)
                }
            })
        })
    )


</script>
</body>
</html>
1.3.3 渲染json 数据
  • 基于前端的js转换数据类型
def home(request):
    if request.method == "POST":
        data = request.POST
        number_one = data.get("number_one")
        number_two = data.get("number_two")
        result = int(number_one) + int(number_two)
        # return HttpResponse(result)
        return HttpResponse(json.dumps({"code": 300, "result": result}))
    return render(request, "home.html", locals())
<script>

    $(document).ready(
        $("#btn_result").click(function () {
            let numberOne = $("#number1").val();
            let numberTwo = $("#number2").val();
            // 基于Ajax发送请求
            $.ajax({
                // 参数 url : 指定当前数据提交的网址,如果不写 form表单的action是一样,默认释放前路由地址
                url: "",
                // type : 请求类型 GET / POST  ,默认是get
                type: "post",
                // data : 自己携带数据 ,做成字典的格式传输数据
                data: {'number_one': numberOne, "number_two": numberTwo},
                // success : 回调函数 , 负责接收到后端返回的数据
                success: function (data) {
                    console.log(data)
                    console.log(typeof (data))
                    // 使用 js自己的序列化方法序列化数据
                    let dataVal = JSON.parse(data)
                    console.log(typeof (dataVal))
                    if (dataVal.code === 200) {
                        $("#result").val(dataVal.result)
                    } else {
                        alert("非法的数据")
                    }
                }
            })
        })
    )


</script>
  • 上述方法,后端传给前端的数据是 string 类型,需要在前端自己做一步类型强转
  • 后端的 jsonresponse对象渲染json格式的数据
  • 发现在前端接收到的数据类型就是 object 类型,不需要额外的转换
def home(request):
    if request.method == "POST":
        data = request.POST
        number_one = data.get("number_one")
        number_two = data.get("number_two")
        result = int(number_one) + int(number_two)
        return JsonResponse({"code": 300, "result": result})
    return render(request, "home.html", locals())
<script>

    $(document).ready(
        $("#btn_result").click(function () {
            let numberOne = $("#number1").val();
            let numberTwo = $("#number2").val();
            // 基于Ajax发送请求
            $.ajax({
                // 参数 url : 指定当前数据提交的网址,如果不写 form表单的action是一样,默认释放前路由地址
                url: "",
                // type : 请求类型 GET / POST  ,默认是get
                type: "post",
                // data : 自己携带数据 ,做成字典的格式传输数据
                data: {'number_one': numberOne, "number_two": numberTwo},
                // success : 回调函数 , 负责接收到后端返回的数据
                success: function (data) {
                    console.log(data)
                    console.log(typeof (data))
                    // 使用 js自己的序列化方法序列化数据
                    {#let dataVal = JSON.parse(data)#}
                    console.log(typeof (data))
                    if (data.code === 200) {
                        $("#result").val(data.result)
                    } else {
                        alert("非法的数据")
                    }
                }
            })
        })
    )
</script>

1.4 Ajax语法总结

<script>
    // 先给按钮绑定点击事件
    $('#btn').click(function () {
        // 向后端发送Ajax请求
        $.ajax({
            // (1)指定发送后端的请求接口
            url: '',// 不写就是朝当前地址发送请求
            
            // (2)请求方式
            type: "post", // 不指定默认就是 get 全小写
          
            // dataType 参数应该是一个字符串,表示期望从服务器返回的数据类型(如 "json", "xml", "script", "html" 等)
            // dataType: "json",
          
            // (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>

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

  • 无论是form表单还是Ajax,传输数据的默认编码格式都是urlencoded
    • 只能传输键值对,无法传输文件数据
  • formdata : 可以传输文件数据 request.FILES
  • json : application/json
def home(request):
    if request.method == "POST":
        data =request.body
        print(data) # b'{"number_one":"32","number_two":"3"}'
        data = data.decode('utf8')
        print(data) # {"number_one":"32","number_two":"3"}
        print(type(data)) # <class 'str'>
        data = json.loads(data)
        print(type(data))
        number_one = data.get("number_one")
        number_two = data.get("number_two")
        result = int(number_one) + int(number_two)
        return JsonResponse({"code": 200, "result": result})
    return render(request, "home.html", locals())
<script>

    $(document).ready(
        $("#btn_result").click(function () {
            let numberOne = $("#number1").val();
            let numberTwo = $("#number2").val();
            // 基于Ajax发送请求
            $.ajax({
                // 参数 url : 指定当前数据提交的网址,如果不写 form表单的action是一样,默认释放前路由地址
                url: "",
                // type : 请求类型 GET / POST  ,默认是get
                type: "post",
                // data : 自己携带数据 ,做成字典的格式传输数据
                data: JSON.stringify({'number_one': numberOne, "number_two": numberTwo}),
                {#data: {'number_one': numberOne, "number_two": numberTwo},#}
                // success : 回调函数 , 负责接收到后端返回的数据
                success: function (data) {
                    console.log(data)
                    console.log(typeof (data))
                    // 使用 js自己的序列化方法序列化数据
                    {#let dataVal = JSON.parse(data)#}
                    console.log(typeof (data))
                    if (data.code === 200) {
                        $("#result").val(data.result)
                    } else {
                        alert("非法的数据")
                    }
                }
            })
        })
    )


</script>

1.6 Ajax传输文件数据

<script>

    $(document).ready(
        $("#btn_result").click(function () {
            let numberOne = $("#number1").val();
            let numberTwo = $("#number2").val();
            let fileVal = $("#file_input")[0].files[0];
            // Ajax携带文件数据需要借助第三方的 formData对象
            // (1)实例化得到一个 form对象
            // 将所有的键值对数据都要放到 form对象中
            let formDataObj = new FormData();
            formDataObj.append("numberOne", numberOne)
            formDataObj.append("numberTwo", numberTwo)
            formDataObj.append("file", fileVal)
            console.log(fileVal)
            console.log(formDataObj)
            // 基于Ajax发送请求
            $.ajax({
                // 参数 url : 指定当前数据提交的网址,如果不写 form表单的action是一样,默认释放前路由地址
                url: "",
                // type : 请求类型 GET / POST  ,默认是get
                type: "post",
                // data : 自己携带数据 ,做成字典的格式传输数据
                // (2)传输的data直接放上面的 form对象即可
                data: formDataObj,
                // (3)走form对象不能让他使用编码对数据进行编码
                contentType: false, // 默认编码是 urlencoded
                // (4)告诉浏览器不要对数据进行额外的处理
                processData: false,
                {#data: {'number_one': numberOne, "number_two": numberTwo},#}
                // success : 回调函数 , 负责接收到后端返回的数据
                success: function (data) {
                    console.log(data)
                    console.log(typeof (data))
                    // 使用 js自己的序列化方法序列化数据
                    {#let dataVal = JSON.parse(data)#}
                    console.log(typeof (data))
                    if (data.code === 200) {
                        $("#result").val(data.result)
                    } else {
                        alert("非法的数据")
                    }
                }
            })
        })
    )
</script>

def home(request):
    if request.method == "POST":
        # 可以用来判断当前的请求方式是否是Ajax
        print(request.is_ajax()) # True
        # print(type(request.body.decode("utf-8")[0]))
        # 获取普通的键值对数据只需要通过 POST方法
        data = request.POST
        print(data)  # <QueryDict: {'numberOne': ['2'], 'numberTwo': ['2']}>
        # 获取form对象中的文件数据也要借助 FILES
        print(request.FILES)  # <MultiValueDict: {'file': [<InMemoryUploadedFile: avatar.jpg (image/jpeg)>]}>
        return JsonResponse({"code": 200, "result": "ok"})
    return render(request, "home.html", locals())

2. django自带的序列化组件

2.1 基于jsonresponse序列化数据

from app01.models import User
def get_user(request):
    # 查询所有用户数据
    user_data_list = []
    user_queryset = User.objects.all()
    for user_obj in user_queryset:
        user_data_list.append(
            {
                "username": user_obj.username,
                "age": user_obj.age,
                "gender": user_obj.get_gender_display()
            }
        )
    print(user_data_list)
    return JsonResponse(user_data_list, safe=False)
  • 前端显示js格式的数据
[
{
"username": "serein",
"age": 18,
"gender": "female"
},
{
"username": "zzp",
"age": 28,
"gender": 2
},
{
"username": "xyk",
"age": 22,
"gender": "female"
}
]

2.2 基于Django自带的serializers

# 使用内置的serializers
def get_user(request):
    # 查询所有用户数据
    user_queryset = User.objects.all()
    user_data_list = serializers.serialize('json', user_queryset)
    # format参数如下,
    # BUILTIN_SERIALIZERS = {
    #     "xml": "django.core.serializers.xml_serializer",
    #     "python": "django.core.serializers.python",
    #     "json": "django.core.serializers.json",
    #     "yaml": "django.core.serializers.pyyaml",
    #     "jsonl": "django.core.serializers.jsonl",
    # }
    print(user_data_list)
    return JsonResponse(user_data_list, safe=False)

  • 前端展示
"[{\"model\": \"app01.user\", \"pk\": 1, \"fields\": {\"username\": \"serein\", \"age\": 18, \"gender\": 1}}, {\"model\": \"app01.user\", \"pk\": 2, \"fields\": {\"username\": \"zzp\", \"age\": 28, \"gender\": 2}}, {\"model\": \"app01.user\", \"pk\": 3, \"fields\": {\"username\": \"xyk\", \"age\": 22, \"gender\": 1}}]"

标签:val,request,number,django,Ajax,result,序列化,data,user
From: https://www.cnblogs.com/Formerly/p/18102499

相关文章

  • 12-Ajax异步交互技术
     同步与异步操作最主要的区别:同步操作必须按照以上步骤执行,而异步操作在第四步响应客户端时,可以继续执行第二步请求服务器,即客户端可以执行其它操作 数据地址:console-mock.apipost.cn/mock/4250f8d4-b605-47eb-9777-07e29548dbb8/list <!DOCTYPEhtml><htmllang="......
  • Ajax 与 Axios 异步请求
    Ajax与Axios异步请求一、服务器对外提供了哪些资源1.网页中如何请求数据 数据,也是服务器对外提供的一种资源。只要是资源,必然要通过请求–处理–响应的方式进行获取。如果要在网页中请求服务器上的数据资源,则需要用到XMLHttpRequest对象。XMLHttpRequest(简称xhr)是......
  • Fastjson反序列化分析
    依赖先研究1.2.24版本的,版本高了就有waf了,不过也能绕,高版本以后再说<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.24</version></dependency><dependency><groupId&g......
  • Django之图形验证码
    【1】生成图片验证码依赖于pillow模块pipinstallpillow使用pillow模块在导入时使用importPIL,而不是pillow【1.1】Pillow图像生成模块fromPILimportImage,ImageDraw,ImageFont#Image:生成图片对象#ImageDraw:生成画笔对象#ImageFont:控制字体样式#图......
  • Django框架之python后端框架介绍
    一、网络框架及MVC、MTV模型1、网络框架网络框架(Webframework)是一种软件框架,用于帮助开发人员构建Web应用程序和Web服务。它提供了一系列预先编写好的代码和工具,以简化开发过程并提高开发效率。网络框架通常包括以下功能和特点:路由处理(Routing):网络框架定义了URL与处理程序......
  • mysql 主从复制 -- django发送钉钉通知
    mysql主从搭建#之前做过redis的主从,很简单#mysql稍微复杂一些,搭建mysql主从的目的是?-读写分离-单个实例并发量低,提高并发量-只在主库写,读数据都去从库#原理MySQL服务器之间的主从同步是基于二进制日志机制(binlog),主服务器使用二进制日志来(bi......
  • 【附源码】django计算机毕业设计web的学生作业管理系统(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在当今信息化、数字化的教育环境中,学生作业管理已成为教学过程中不可或缺的一部分。传统的作业管理方式,如纸质作业本、电子邮件提交等,存在着效率低下、资源......
  • 【附源码】django计算机毕业设计病房管理系统设计与实现(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在现代医疗体系中,病房管理是医院运营的重要组成部分。随着科技的不断进步和信息化水平的提高,传统的手工或半自动化的病房管理模式已经无法满足现代医疗服务......
  • 关联数据和序列化
    由于EFCore会自动修正导航属性,因此在对象图中可能会产生循环引用。例如,加载博客及其关联文章会生成引用文章集合的博客对象。其中每篇文章将返回引用该博客。某些序列化框架不允许使用循环引用。例如,Json.NET在发现循环引用的情况下,会引发以下异常。Newtonsoft.Json.Json......
  • AJAX(Asynchronous JavaScript and XML)是一种用于创建交互式网页应用程序的技术
    AJAX(AsynchronousJavaScriptandXML)是一种用于创建交互式网页应用程序的技术。通过在后台与服务器进行异步通信,实现在不重新加载整个页面的情况下更新部分页面内容。而Spring是一个开源的Java框架,它提供了一种简化Java开发的方式,包括Web应用程序开发。下面是一个使用AJAX......