zoukankan      html  css  js  c++  java
  • 使用NbView实现删除和查询,中间件,封装request.PUT

    把views_new.py的delete方法拷贝到custom_view.py里,然后定义model_class = None,怕这个赋值错了,又封装了一个model方法,custom_view.py里新增的代码如下图:

    接下来配置model_class,在view3.py里新增如下代码:

    然后在postman里执行删除操作,传一个id,case或project表传一个id都可以实现删除,如下图:

    去case表里可以看到id为1的case被删除,然后删除一个不存在id,也没有报错,因为不存在就get到id=None,就相当于id为空,什么都不删除

    写修改的代码前先了解一下中间件,先在utils目录下新建一个middle_ware.py文件,新增代码如下图:

    这三个方法不一定都要写,根据需求写,然后在settings.py的MIDDLEWARE里写上中间件的路径:'utils.middle_ware.PutMiddleware',在postman里执行删除操作,在pycharm日志里可以看到如下图:

    先走的是middle_ware.py里的process_request方法,然后走到custom_view.py里的delete方法,然后走到middle_ware.py里的process_response方法,请求的流程是先走中间件,先在settings.py的MIDDLEWARE数组里从上到下依次执行一遍,所以先打印的是process_request,然后走的是view,也就是costom_view.py里的delete方法,打印delete...,然后从MIDDLEWARE数组里依次向上返回,打印出process_response,中间件的功能有好多,可以在process_request里加上
    print(request.META),获得某个请求的ip,还有白名单设置等

    如果costom_view.py里的delete方法里代码有写错的地方,把self.model.objects.filter(id=id).delete()改成self.model.objects.delete(id=id)就会走到process_exception,也可以捕捉到异常的原因,为了使报错少一些,可以修改一下代码,首先导入from .custom_response import nb_response,然后修改middle_ware.py里的process_exception方法,如下图:

    在用postman跑一下,可以看到如下图:

    在pycharm日志里可以看到打印的异常原因,如下图:

    如果没写return nb_response(-1, '未知错误'),运行postman时,在postman里看到一大堆错误,process_exception方法是做统一的异常处理,不会让用户看到一大堆错误

    复制views_new.py里的CaseSet里的put方法的ifelse里的代码到middle_ware.py的process_request方法里,因为这几行代码是解析PUT请求的,接下来封装request.PUT,首先要导入from django.http import QueryDict,修改后的代码如下图:

    请求来之前,先走process_request,已经解析出数据,加了两个属性request.PUTrequest._files复制views_new.py里的CaseSet里的put方法的代码到custom_view.py里,删除掉if和else,修改后put方法如下图:

    把写死的都写成变化的,修改后代码如下图:

    因为是PUT方法,id写在body里,如果是GET,id要写在url的后面,接下来验证一下修改的功能,在postman里配置如下图:

    修改完成后,实现了增删改,接下来完成查询操作,在custom_view.py里实现查询的代码,实现查询前首先把分页实现了,定义一个分页函数get_paginator(),然后在utils目录下创建一个文件const.py,const.py里的代码如下图:

    实现get_paginator代码写到一半时,遇到model_to_dict这个问题,因为model_to_dict没有把时间展示出来,新增get_paginator代码没有写完,暂时如下图:

    通过查看model_to_dict的源码,日期和时间出不来的原因是日期和时间是不可编辑的,源码里有下面的代码导致

    if not getattr(f, 'editable', False):
    continue

    把上面两行代码注释掉就可以展示出日期和时间,于是在utils目录下的tools.py里粘贴的代码如下图:

    def model_to_dict(instance, fields=None, exclude=None):  # 这个函数是我新加的
    """
    fields是返回哪些字段,exclude是排除哪些字段
    这个方法是参考了django自带的model_to_dict方法,做了修改,因为django自带的model转字典的方法
    日期类型的它不返回,所以改了一下,源码的位置在
    from django.forms.models import model_to_dict
    """
    opts = instance._meta # 所有的字段
    data = {}
    for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many):
    if fields and f.name not in fields: # 判断传进来的字段是否在表里
    continue
    if exclude and f.name in exclude: # 判断是否有排除的字段
    continue
    value = f.value_from_object(instance)
    if isinstance(value, datetime.datetime): # 跟源码差不多,加了下面这两个if,使时间格式化,删除了上面的可编辑判断
    #value = int(value.timestamp()) # 如果想展示时间戳用这个
    value = value.strftime('%Y-%m-%d %H:%M:%S')
    if isinstance(value, datetime.date):
    value = value.strftime('%Y-%m-%d')
    #value = int(value.timestamp())
    data[f.name] = value
    return data

    然后导入import datetimefrom itertools import chain,在custom_view.py里导入自己封装的model_to_dict,删除之前的model_to_dict,修改后custom_view.py里的代码如下图:

    view3.py里的代码如下图:

    然后通过postman进行查询,上面四个条件都满足,如下图:

    如果已经有数据库存在的情况下,通过python manage.py inspectdb > model1.py,回车,找到model1.py文件,打开model1.py文件,可以看到好多类,inspectdb的作用是会自动的找到配置文件连接的哪个数据库,找到数据库之后,把数据库的表结构转化成一个类重定向到一个文件里,然后去这个文件里查对应的类,发现类与类之间有外键的字段没有写,要自己手写一下

    如果只有查询权限,没有其他权限,那要改一下custom_view.py文件,拆分NbView,把各个方法都写成一个类,然后继承一下就可以了,修改后代码如下图:

    把每个功能都封装成一个类,然后继承就可以了,在view3.py文件里导入GetView,然后CaseView继承GetView,在postman里执行查询操作,ok,没有问题,执行post、delete、put都报405,如下图:

  • 相关阅读:
    Path Sum II
    Convert Sorted Array to Binary Search Tree
    Construct Binary Tree from Inorder and Postorder Traversal
    Construct Binary Tree from Preorder and Inorder Traversal
    Maximum Depth of Binary Tree
    Binary Tree Zigzag Level Order Traversal
    Binary Tree Level Order Traversal
    Same Tree
    Validate Binary Search Tree
    Binary Tree Inorder Traversal
  • 原文地址:https://www.cnblogs.com/laosun0204/p/12313028.html
Copyright © 2011-2022 走看看