实现修改接口,使用NbView实现添加和nb_response去掉大括号
新增和查询的都已经实现了,接下来在views_new.py文件里的CaseSet类里实现删除功能,新增代码如下图:
对于唯一字段的,逻辑删除还会报已存在,直接物理删除就行了,接下来用postman实现,如下图:
修改功能put方法的代码如下图:
接下来在postman里实现put请求,如下图:
request.GET只能取到url里传的数据?后的XXX=XX,request.POST可以取到postman中body里k-v的数据,只能是post请求的时候取到,其他的请求方式只能通过原始数据进行解析了,put方法里代码如下:
在postman里用第一种请求方式form-data,然后通过print(dir(request)),看到好多方法,包括parse_file_upload和content_type,先把views_new.py文件里的CaseSet类中的修改方法写一下,前提是导入from django.http import JsonResponse, HttpResponse
在postman里用第一种请求方式:form-data,但是可能会上传文件,如下图:
点击Send按钮后,在postman里可以看到返回的ok,在pycharm日志里print(dir(request))可以看到下图的方法:
print(request.META),打印请求头,可以看到下图的方法:
把代码改一下,把print(request.META)改成print(request.body),从print(dir(request))打印出来的有body方法,打印请求的正文信息,在用postman请求一下,在pycharm的日志里看到如下图:
打印了两个form-data,我确实传了id和name,从上图中可以看到中间的分隔符是\r\n...,要想拿到其他请求方式的请求数据只能通过request.parse_file_upload方法实现,看这个方法的源码,里面传两个参数(request.META, request),修改put方法的代码如下:
点击postman里的Send按钮,在上图里可以看到打印的日志
接下来用第二种请求方式:x-www-form-urlencoded,这种方式不会上传文件,如下图:
print(request.META)可以看到下图的方法:
把代码改一下,把print(request.META)改成print(request.body),打印请求的正文信息,在用postman请求一下,在pycharm的日志里看到如下图:
传了id和name,从上图中可以看到中间的分隔符是&,为了解决这两种问题,前提还要导入from django.http import JsonResponse, HttpResponse, QueryDict,方法parse_file_upload用来解析数据,源码里传两个参数,一个是META,另一个是POST.DATA,在这里传入request.META和request,使用如下的代码获取数据,如下图:
postman配置如下图:
点击Send按钮,在日志看到如下图:
postman里两种请求方式form-data和x-www-form-urlencoded的区别是前者request.META打印出的是'CONTENT_TYPE': 'multipart/form-data...',multipart/form-data是多媒体类型,有可能会上传文件,后者打印的是'CONTENT_TYPE': 'application/x-www-form-urlencoded',x-www-form-urlencoded是普通文本类型,不会上传文件,所以要判断多媒体类型,代码如下图:
再用postman请求时报fail,如下图:
然后要实现此功能要把models.py里的CaseSet里的describe中加上blank=True,null=True表里字段可以为空的,blank=True是在form表单发请求时为空(数据库里该字段可以为空),如果没用form,blank=True没有意义,再次请求就OK了
接下来在models.py里创建一个项目表,复制CaseSet这个类,然后改一下类名为Project等,修改代码如下图:
然后执行python manage.py makemigrations和python manage.py migrate,生成project表,接下来在forms.py里创建form,把上面的CaseSetForm复制过来,改成ProjectForm,把表改成Project,如下图:
在utils目录下创建一个custom_view.py文件,里面创建一个PostView类,继承View,把views_new.py里的CaseSet中的post方法拷过来,复制到PostView类下,新增代码如下图:
接下来在testcase目录下新增一个文件view_custom.py,新增代码如下图:
然后配置url,在urls.py里首先要导入view_custom.py,新增代码如下图:
然后启动服务,在postman里的配置如下:
成功后再添加一条,去project表里看到两条数据,原理是custom_view.py里有一个PostView方法,还有一个form_class变量,如果直接运行这个文件会报错,因为form_class=None,但是view_custom.py里的ProjectView继承了PostView,并把ProjectForm赋值给了form_class,因此ProjectView类里有了post方法,form = self.form_class(request.POST)就相当于form = ProjectForm(request.POST),因为ProjectForm里定义了fields或exclude,就会把需要的字段传过来进行添加,同理下面的CaseView也是一样的原理
接下来在view_custom.py再导入CaseForm,新增代码如下图:
然后配置url,在urls.py里新增代码path('case', view_custom.CaseView.as_view()),把上面的case路径注释掉,如下图:
在postman里的配置如下图:
添加成功后在case表里可以看到添加成功的数据
为了防止view_custom.py里赋值出现错误,容易把form_class赋值成Project,还不好排查,因此需要修改一下custom_view.py里的代码,在这里把错误拦截住,新增代码如下图:
将view_custom.py改成view3.py,将PostView改成NbView,把相应的继承和导入,以及urls.py都改一下
接下来在custom_view.py里实现删除,删除前要在utils目录下新建一个文件custom_response.py,为了避免代码里出现太多的大括号,写一个公共的函数,新增代码如下图:
然后修改custom_view.py文件的代码,修改如下图:
custom_view.py里的代码是框架层的,代码写完后用postman验证一下,如下图:
反之去掉任意一个必填项,就会报-1和报错信息