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,如下图:

  • 相关阅读:
    nginx详解
    keeplived高可用集群
    mysql主从同步
    elasticsearch基础
    redis集群管理--sentinel
    socket阻塞与非阻塞,同步与异步,select,pool,epool
    django+channels+dephne实现websockrt部署
    Django+Nginx+uWSGI生产环境部署
    进制转换
    对golang指针的理解
  • 原文地址:https://www.cnblogs.com/laosun0204/p/12313028.html
Copyright © 2011-2022 走看看