首页 > 编程语言 >Python基础day62 DjangoAjax的传输应用

Python基础day62 DjangoAjax的传输应用

时间:2023-08-08 21:36:09浏览次数:36  
标签:obj Python request Django json day62 DjangoAjax 格式 数据

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

前后端数据传输的请求方式有两种:get、post

我们只研究post请求的编码格式

三种编码格式

urlencoded

form-data

json

发送post请求的方式

form表单

Ajax

postman(第三方工具,需要下载)

 

form表单发送post请求的时候数据的编码格式

请求头content-Type:参数

默认提交的编码格式:application/x-www-form-urlencoded

他的数据格式:username=dasdas&password=dasdas&gender=dasdas

Django后端如何接受的?

  Django后端针对符合urlencoded格式的数据,Django把数据都封装到了request.POST中了

 

multipart/form-data

编码格式从urlencoded改成form-data有什么效果?

  form表单就可以提交文件数据了

数据格式:

Content-Type:
multipart/form-data; boundary=----WebKitFormBoundary7iwnnLo3TDiHIAQz--->文件数据

Django后端如何接受的?

针对普通数据Django把数据封装到了request.POST中

针对文件数据Django把数据封装到了request.FILES中

 

Ajax提交post请求的数据时候,编码格式?

默认的提交格式是:application/x-www-form-urlencoded; a=1&b=2

Django后端针对符合urlencoded格式的数据,django把数据都封装到了request.POST

 

Ajax提交json格式的数据

提交json格式的数据必须满足两个条件:

1. 编码格式必须是json格式的:contentType参数

2. 数据必须是json {“a”:1}

 

Django后端如何处理json格式的数据?

针对Ajax提交的json格式的数据,Django后端不再把数据封装到request.POST中了

对于json格式的数据,django后端不在做任何的封装,数据是纯原生的,发送过来的数据是二进制形式的

我们自己来处理这些二进制数据

# js中序列化
JSON.stringify({'a': 1, b: 2})  ----------》{'a': 1, b: 2} 对象
contentType:'application/json',
    

# django后端接收json格式的数据
json_str = request.body.decode('utf-8')
print(json_str)  # {"a":1,"b":2}

json_data = json.loads(json_str)
print(json_data)  # {'a': 1, 'b': 2}
print(json_data.get('a'))

Ajax提交文件数据(重要)

# 前端

<body>
<input type="text" id="username">
文件:<input type="file" id="myfile">
<button class="btn btn-primary">上传</button>
<script>
    $('.btn').click(function () {
        var username = $('#username').val()
        var myfile = $('#myfile')[0].files[0]
        //发送文件数据到后端需要借助于FormData对象
        var myFromDataObj = new FormData();
        myFromDataObj.append('username',username)
        myFromDataObj.append('myfile',myfile)

        $.ajax({
            url: '',
            type: 'post',
            data: myFromDataObj,
            contentType: false,  //告诉浏览器不要做任何的编码处理,Django自己来做处理
            processData: false,  //告诉浏览器不要对我处理的数据做任何处理
            success: function (res) {
                console.log(res)
            }
        })
    })

</script>
</body>

# 后端
def files(request):
    if request.method == 'POST':
        # print(request.POST)  # <QueryDict: {'username': ['瓦达']}>
        # print(request.FILES)  # <MultiValueDict: {'myfile': [<InMemoryUploadedFile: 弥豆子.jpg (image/jpeg)>]}>
        file_obj = request.FILES.get('myfile')
        print(file_obj,type(file_obj))
        print(file_obj.name, type(file_obj.name))
        with open(file_obj.name, 'wb') as z:
            for i in file_obj:
                z.write(i)
    return render(request, 'files.html')

Ajax结合layer弹窗实现删除的二次确认

使用第三方的UI弹窗:layer、sweetalert

https://layuiweb.com/layer/index.htm-----------------layer弹窗模版网站

<script>
        $('.del').click(function () {
            // 删除的逻辑,当我们点击删除按钮的时候,应该获取点击行的id,然后把这个id传到后端
            //做删除逻辑
            //找到点击行的id值
            var id = $(this).attr('delete_id');
            var _this = $(this)
            //发送Ajax请求,做一个二次确认
            layer.confirm('您确定要删除吗?', {
                btn: ['删了它', '点错了'] //按钮
            }, function () {
                $.ajax({
                    url: '/book_delete/',
                    type: 'post',
                    data: {id: id},
                    success: function (res) {
                        //第一种方式:使用location.reload()刷新
                        {#layer.msg(res.msg, {icon: 1}, function (){#}
                        {#    location.reload()})#}
                        layer.msg(res.msg, {icon: 1})
                        //第二种方式:定义.btn位置,再找父标签,删除tr字段
                        {#_this.parent().parent().remove()#}
                        //第三种方式:直接给tr字段赋予一个动态类属性,直接通过类属性找到标签删除
                        $('.tr_'+id).remove()
                    }
                })
            });

        })
    </script>

批量插入数据

# 在django中批量插入数据
# for i in range(10000):
    #     models.UserInfo.objects.create(username='jerry_%s' % i)
    """为什么插入的数据很慢?"""
    # insert into userinfo values('jerry');
    # insert into userinfo values('jerry'), ('jerry_2'), (),('jerry'), ('jerry_2'), ();
    user_obj_list = []
    for i in range(100000):
        user_obj = models.UserInfo(username='jerry_%s' % i)
        user_obj_list.append(user_obj)
        print('jerry_%s' % i)

    '''开始操作数据库'''
    models.UserInfo.objects.bulk_create(user_obj_list)

 

标签:obj,Python,request,Django,json,day62,DjangoAjax,格式,数据
From: https://www.cnblogs.com/zfq132/p/17615426.html

相关文章

  • opencv-python特征检测
    本章节介绍Harris角点检测,SIFT关键点检测,shi-Tomasi角点检测,SURF特征检测,ORB特征检测。特征检测是提取图像信息,决定每个图像的点是否属于一个图像特征。其结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点,连续的曲线或连续的区域。特征检测包括边缘检测,角检测,区域检测......
  • python实现pdf转word
    frompdf2docximportConverterimportPySimpleGUIassgdefpdf2word(file_path):file_name=file_path.split('.')[0]doc_file=f'{file_name}.docx'p2w=Converter(file_path)p2w.convert(doc_file,start=0,end=None)......
  • Python 装饰器
    装饰器的基本语法装饰器本质上就是“定义一个闭包并用语法糖@简练地调用该闭包”,从而实现把一个方法对象当做参数,传入到另一个方法中,然后返回一个增强功能的新方法对象。在Python中允许在一个方法中嵌套另一个方法,这种特殊的机制就叫做「闭包」,这个内部方法可以保留外部方法......
  • 软件测试|Python random模块,超乎想象的强大
    Python的random模块是一个非常强大的工具,用于生成随机数和随机选择。它提供了许多函数和方法,可以满足各种随机化需求。本文将介绍random模块的基本功能和常见用法,以帮助读者更好地理解和利用这个模块。返回整数random.randange()语法如下:random.randrange(stop)random.randrange(s......
  • Python中文件操作的详细使用:open()、os.open()和with open()
    前言在编程语言中,文件读写是最常见的IO操作,Python内置了读写文件的函数,其中包括open()函数、os.open()函数以及withopen()语句。本文将详细介绍这三种方法的使用方式、区别和最佳实践。open()open()函数是Python内置的用于打开文件的函数,它接受一个文件路径和打开模式作为参数,并返......
  • Python_GUI(pySide)开发指南(@Like)
    Python_GUI(pySide)开发指南(@Like) 目录一、PythonGUI简介二、PySide6工具安装1.安装VSCode:https://code.visualstudio.com/2.安装Python:https://www.python.org/downloads/3.安装PyCharm:https://www.jetbrains.com/pycharm/4.更新pip: 命令python.exe-mpip......
  • Python | isinstance函数
    isinstance函数isinstance的意思是“判断类型”;isinstance()是一个内置函数,用于判断一个对象是否是一个已知的类型,类似type()。isinstance()与type()区别type()不会认为子类是一种父类类型,不考虑继承关系。isinstance()会认为子类是一种父类类型,考虑继承关系。如果要判......
  • 我的python路-python基础
    以前用的比较多的语言是java,但是自从从事测试行业以来,发现“通用的语言”竟然是python!呜呼~各种评论都说python学习很简单,but一点也不简单好吗,本次分享就是一个记录,给一些小白同学做参考,大神请帮忙指正错误~~本期学习笔记:1、python语言使用变量直接赋值即可,不用声明类型,但是使......
  • python 标准库Enum模块
    1.Enum模块简介枚举(enumeration)在许多编程语言中常被表示为一种基础的数据结构使用,枚举帮助组织一系列密切相关的成员到同一个群组机制下,一般各种离散的属性都可以用枚举的数据结构定义,比如颜色、季节、国家、时间单位等enum规定了一个有限集合的属性,限定只能使用集合内的值,明......
  • Unittest + python + Selenium + HTMLTestRunner 自动化测试
      1.测试框架参数说明 base/base_page.py对selenium方法进行二次封装 config/setting.py基础信息 pageobject/把每个页面的页面元素和操作,放在一个py文件中。测试用例只需引用对应页面的操作 report存放测试报告的 runcase/start_ca......