『Django』APIView视图扩展,实现不同的请求方式

点赞 + 关注 + 收藏 = 学会了

本文简介

之前讲 DRF 时都是用 GET 请求来讲解,其实 DRF 还提供了 POSTPUTDELETE 等方法。只要在视图函数前面加一个装饰器说明一下可支持的请求方法即可。

动手试试

我们知道,路由地址一般写在 urls.py 文件里,而路由对应的响应方法一般写在 views.py 里。

想让某个方法支持某些请求,可以在视图 views.py 里的指定方法前面加一个装饰器。

我继续使用之前创建的项目( https://mp.weixin.qq.com/mp/homepage?__biz=MzAwMjU3ODU5Ng==&hid=22 ),在这基础上做调整。

blog 应用中调整一下 views.py 的代码。

# blog/views.py

from rest_framework.decorators import api_view
from rest_framework import status
from rest_framework.response import Response
from blog.models import Article
from .serializers import BlogListSerializer

@api_view(["GET", "POST"])
def apiBlogList(request):
  if request.method == "GET":
    articleList = Article.objects.all()
    serializer = BlogListSerializer(articleList, many=True)
    return Response(serializer.data, status=status.HTTP_200_OK)

  if request.method == "POST":
    serializer = BlogListSerializer(data=request.data)

    if serializer.is_valid():
      serializer.save()
      return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

上面的代码定义了一个 apiBlogList 方法,在定义该方法之前我用了一个装饰器 @api_view(["GET", "POST"]) 描述这个方法接收 GETPOST 两种请求方法。

然后通过 request.method 判断前端使用 GET 还是 POST 方法做请求。

如果是 GET 请求,就执行查询文章列表的操作。

如果是 POST 请求,就将客户端提交过来的数据做一下校验 serializer.is_valid()。当必传的字段都传过来后,serializer.is_valid() 回返回 True ,此时我们就调用 serializer.save() 方法将数据写入数据库。

如果 serializer.is_valid() 返回 False ,意味着必传字段没传过来,或者传过来的数据是错的,此时就返回一个报错信息给客户端 serializer.errors

这里我们还通过 status=status.xxx 返回一个状态码给客户端,其中 HTTP_201_CREATED 表示正常,HTTP_400_BAD_REQUEST 表示异常。


打开 Postman 或者其他调试工具。

当我发送一个 GET 请求到 http://127.0.0.1:8000/api/blog/apiBlogList/ 时,会执行 if request.method == "GET" 里的代码,查询博客列表的所有数据返回给客户端。

而使用 POST 请求时,我们需要在 Body 里传入必传数据给这个接口。如果我们少传了数据,serializer.is_valid() 就会返回 False ,然后通过 serializer.errors 告诉请求方这次请求出现了什么问题。

当我们把必传的数据都传过来后,serializer.is_valid() 就会返回 True,然后执行 serializer.save() 将数据保存入库。

此时我们再用 GET 请求一下,就能看到刚刚传入数据库的那条数据了。


以上就是 DRF 对视图的扩展功能。DRF 不止支持函数视图,还支持类视图,下一篇文章再聊聊类视图怎么写。

点赞 + 关注 + 收藏 = 学会了

posted @ 2024-11-14 09:18  德育处主任  阅读(1)  评论(0编辑  收藏  举报