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

原文地址:https://www.cnblogs.com/laosun0204/p/12313028.html