55、前后端传输数据的编码格式、ajax提交json格式的数据、文件数据、结合layer弹窗实现删除二次确认、django自带的序列化组件、批量插入数据

107 阅读4分钟

今日内容概要

  • 前后端传输数据的编码格式
  • ajax提交json格式的数据
  • ajax提交文件数据
  • ajax结合layer弹窗实现删除的二次确认
  • django自带的序列化组件(Serializers)
  • 批量插入数据

今日内容详细

前后端传输数据的编码格式-- Content-Type

1.前后端传输数据的编码格式(3种):
    1.urlencoded 
    2.form-data 
    3. json
2.我们只研究post请求的编码格式,因为get请求传输数据的格式直接是:url?k=v&k=v
3.form表单它只能够传输urlencoded、form-data格式的数据;json格式的数据form表单是没有办法提交的
4.能够提交json格式的数据的方式:
    1.ajax
    2.第三方工具:postman
5. form表单提交数据的编码格式
	 1.form表单默认提交数据的编码格式:urlencoded;
   2.验证:在Request Headers里
    			Content-Type: application/x-www-form-urlencoded
   ps:对于urlencoded格式的数据,django后端都会封装到request.POST中去,数据格式:username=nana&password=qwe(payload中查看)
6.form表单提交文件数据格式:form-data,其既可以提交文件数据,也可以提交普通数据格式
	1.改数据格式 enctype="multipart/form-data"
  2.form表单提交文件数据格式:form-data
  3.验证:在Request Headers里
  	Content-Type: multipart/form-data; boundary=----WebKitFormBoundary89rJVxEJi3V8oHXH
    ps:后面是二进制数据
7.针对form-data格式的数据,django后端会把普通数据还是封装到rquest.POST中,对于文件数据封装到了request.FILES中了
	eg:<MultiValueDict: {'myfile': [<InMemoryUploadedFile: 创建项目1.png (image/png)>]}>
8.研究ajax
	1.默认的提交格式:urlencoded
  		Content-Type: application/x-www-form-urlencoded; charset=UTF-8
  2.django后端也是把普通数据封装到了request.POST中

ajax提交json格式的数据

1.ajax要想提交json格式的数据,必须满足两个条件:
  	1.content-type必须是:json (因为默认是urlencoded)
    2.传输的数据必须是json格式的
    
2.如何更改contentType
	参数:contentType:'application/json'
  检验:在Request Headers里
  		Content-Type: application/json
    
3.json格式--序列化
		data:JSON.stringify()
  
4.ajax提交的json格式数据,django后端没有把数据封装到request.POST中
5.如何获取ajax提交的json格式数据?
	Django后端使用request.body
  request.body----->b'{"a":1,"b":1,"c":2}'----->二进制
  
	需求:将后端接收到的数据变为字典格式---解码,反序列化 --->可以直接反序列化json.loads()
  eg:
        bytes_data= request.body
        str_data = bytes_data.decode('utf-8')
        dic_data = json.loads(str_data)
        print(dic_data,type(dic_data))
        
        bytes_data= request.body
        dic_data = json.loads(bytes_data)
        print(dic_data,type(dic_data))
  ps:针对ajax提交的json格式数据,django后端没有做任何的封装,纯原生数据,在request.body中,需要我们自己手动处理数据格式
6.总结:
	1.第一步:更改contentType
  2.数据变为json格式:序列化
<script>
    $(".btn").click(function (){
        $.ajax({
            url:'',
            type:'post',
            data:JSON.stringify({'a':1, 'b':1, c:2}),
            contentType:'application/json',
            success:function (){
            }
        })
    })
</script>

ajax提交文件数据

1.  .val()   获取普通数据
	  [0].files[0]  获取文件数据
  eg:
    var username = $("#username").val();
    var password = $("#password").val();
    var myfile = $("#myfile")[0].files[0];
    
2.ajax提交文件数据,需要借助于form-data()
		1.var myFormDataObj = new FormData()
    2.myFormDataObj.append(k,v)
    3.需要加两个参数
  		contentType:false--->告诉浏览器不要修改任何的编码格式
      processData:false--->告诉浏览器不要对数据进行任何的修改或者干扰
3.后端接收数据:request.POST  request.FILES
4.总结:
	1.ajax提交文件数据,需要借助于form-data()
  		var myFormDataObj = new FormData()
  2.获取数据,然后添加到myFormDataObj
  		myFormDataObj.append('password', password);
    	myFormDataObj.append('myfile', myfile);
	3.修改参数
  	contentType:false
    processData:false
  4.在django后端,普通数据还是在request.POST中,文件数据在request.FILES里面
  	print(request.POST)  # <QueryDict: {'username': ['nana'], 'password': ['123']}>
    print(request.FILES)  # <MultiValueDict: {'file': [<InMemoryUploadedFile: wsgi.png (image/png)>]}>
<script>
    $(".btn").click(function () {
        // 1.获取数据
        var username = $('#username').val();
        var password = $('#password').val();
        var file = $('#file')[0].files[0];
        {#console.log(file)#}

        //2.提交数据,需要借助于form-data
        var myFormDataObj = new FormData();
        myFormDataObj.append('username', username)
        myFormDataObj.append('password', password)
        myFormDataObj.append('file', file)

        $.ajax({
            url: '',
            type: 'post',
            data: myFormDataObj,
            //3.添加参数
            contentType:false,
            processData: false,
            success: function () {
            }
        })
    })
</script>

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

1.学会如何使用第三方工具---->看文档,根据文档把工具学会使用
	eg:layui:
    https://layuiweb.com/demo/layer.html
    https://layuiweb.com/layer/index.htm
    
2.下载--解压layer.js---配置文件添加:STATICFILES_DIRS

3.验证是否引入成功:layer.msg('hha')

4.点击事件----cv代码
	"""
  //询问框
  layer.confirm('您是如何看待前端开发?', {
    btn: ['重要','奇葩'] //按钮
  }, function(){
    layer.msg('的确很重要', {icon: 1});
  }, function(){
    layer.msg('也可以这样', {
      time: 20000, //20s后自动关闭
      btn: ['明白了', '知道了']
    });
  });
	"""
  
5.ajax---hidden属性:获取值
	<input type="hidden" value="1" id="d1">
  var id = $("#d1").val();
  data:{id:id}
  
6.删除操作---状态码
	back_dic = {'code': 200, 'msg': '删除成功'}
  
7.补充:
	beforeSend函数:没有返回前会出现前出现一个转动的loading小图标或者“内容加载中..”,用来告知用户正在请求数据。这个就可以用beforeSend方法来实现

ab_layer.html

<body>
<input type="hidden" value="3" id="d1">
<button class="btn">删除</button>
<script>
    $('.btn').click(function () {
        var id = $("#d1").val();
        var index = null;
        //询问框
        layer.confirm('确定删除吗?', {
            btn: ['确定'] //按钮
        }, function () {

            //删除操作
            $.ajax({
                url: '/delete/',
                type: 'post',
                data: {id: id},
                beforeSend: function () {
                    //loading层
                    index = layer.load(1, {
                        shade: [0.1, '#fff'] //0.1透明度的白色背景
                    });
                },
                success: function (res) {
                    layer.close(index)
                    if (res.code == 200) {
                        layer.msg(res.msg)
                    }

                }
            })

            l
        });

    })
</script>

</body>

Views.py

def ab_layer(request):
    return render(request,'ab_layer.html')
from app01 import models
from django.http import JsonResponse
import time
def delete(request):
    print(request.POST)
    id = request.POST.get('id')
    time.sleep(5)
    models.Book.objects.filter(pk= id).delete()
    back_dic = {'code': 200, 'msg': '删除成功'}
    return JsonResponse(back_dic)

django自带的序列化组件

1.需求:从数据库中查询几条数据,序列化给到前端,以列表套字典的形式
	1.方式一:for循环添加
  	def show_data(request):
    user_list = models.Book.objects.all()
    l1 = []
    for user_obj in user_list:
        dic = {
            'name':user_obj.username
        }
        l1.append(dic)
    return JsonResponse(l1,safe=False)
  2.方式二:序列化组件(需要到模块-from django.core import serializers)
  				---json.cn解析
  	from django.core import serializers
    def show_data(request):
        user_list = models.Book.objects.all()
        l1 = serializers.serialize('json',user_list)
        return JsonResponse(l1,safe=False)
2.以后项目是前后端分离的项目,没有办法使用django模版语法,那后端的数据如何给到前端?
	django可以写一个借口,最终给前端的数据格式就是呗序列化后的数据

批量插入数据

1.需求:book表插入10000条数据
		1.for循环插入数据
  			for i in range(100000):
            models.Book.objects.create(username='%s'%i)
        ps:运行特别慢,其原因是不停地对数据库进行orm操作
    2.批量插入数据:bulk_create()
        book_list = []
        for i in range(10000):
            book_obj =models.Book(username='%s'%i)
            book_list.append(book_obj)
        models.Book.objects.bulk_create(book_list)
    底层原理:一次插入多条数据 insert into table (username) values(1,'kevin'),(1,'kevin'),(1,'kevin'),(1,'kevin'),(1,'kevin'),(1,'kevin')
    
2.分页
	第一页:select * from app01 limit 1,500
  第二页:select * from app01 limit 501,1000
  第三页:select * from app01 limit 1001,1500
	最后一页:select * from app01 limit 99501,100000 ==>select * from user---查了前面多有数据,再丢弃
  
3.不管数据有多大,只要不去查库,效率都可以忽略,
  以后再实际项目中,能够一次操作数据库完成的动作,就要尽量使用一次性的
  
4.面试题:你对Mysql查询性能优化有什么好的见解