APIView

本文介绍了如何在Django中创建一个包含书名、价格和出版社的图书表,并通过APIView实现增删改查功能。同时讨论了在使用Postman操作时遇到的CSRF问题以及如何通过继承APIView来自动处理认证和权限问题。
摘要由CSDN通过智能技术生成

我们在学APIView之前,先做一个小练习:创建一个图书表,里面含有书名,价格及出版社名称,然后做出它的增删改查开放接口再用postman进行操作。

首先创建Books表:

然后创建路由,开放接口,做出它的增删改查。

app01路由:

admin路由:

然后创建视图:

from django.http import JsonResponse
# Create your views here.
from django.views import View
from .models import Book

class BookView(View):
    def get(self, request):
        obj_list = Book.objects.all()
        l = []
        for obj in obj_list:
            l.append({'name': obj.name, 'price': obj.price, 'publish': obj.publish})
        return JsonResponse({'code': 100, 'msg': '查询成功', 'results': l})

    def post(self, request):
        data = request.POST
        Book.objects.create(name=data.get('name'), price=data.get('price'), publish=data.get('publish'))
        return JsonResponse({'code':100, 'msg':'新增成功'})

from urllib.parse import unquote
class BookDetailView(View):
    def get(self, request, pk):
        obj = Book.objects.filter(pk=pk).get()
        return JsonResponse({'code':100, 'msg':'查询成功', 'results':{'name':obj.name, 'price':obj.price, 'publish':obj.publish}})

    def delete(self, request, pk):
        Book.objects.filter(pk=pk).delete()
        return JsonResponse({'code':100, 'msg':'删除成功'})


    def put(self, request, pk):
        body_str = request.body.decode('utf-8')
        body_list = body_str.split('&')
        dic = {}
        for item in body_list:
            dic[item.split('=')[0]] = unquote(item.split('=')[1])
        Book.objects.filter(pk=pk).update(**dic)
        return JsonResponse({'code':100, 'msg':'修改成功'})

这样,关于这个表的增删改查就做好了。

增:

删:

改:

查其一:

查所有:

APIView

当我们写完上述代码后,我们遇到两个问题:

  1. 前端body体中的数据,有时候能用request.POST取出来,有时候取不出来
  2. csrf 问题,必须注释掉相关中间件

当我们通过继承APIView之后,我们就可以避免掉上面的问题了。

APIView是drf提供的视图类。

APIView就是在原有继承view类/函数里,将view换成APIView.

总结:

  1. 只要继承了APIView,就不需要处理csrf.
  2. 以后前端提交的数据,无论什么编码或者请求方式,数据都从request.data中取
  3. 只要继承了APIView,request就是新的reqest了,它有新的data
  4. 在执行跟请求方式同名的方法前,执行了三大认证:认证(是否登录),频率(是否太快),权限(是否符合权限)。
  5. 只要在三大认证或者视图类的方法中出了异常都会被捕获,统一处理。

Request对象

根据上面APIView的总结提到,我们继承了APIView之后,request就不是以前的request了,但是旧的request的所有操作新的都可以用。

但是毕竟是新的request,它还多了一些方法:

  • request.data --> 请求体的数据
  • request.query_params --> 原来的request。GET
  • request._request --> 老的request方法

如何用:

from rest_framework.requset import Request
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值