『Django』APIView视图扩展,实现不同的请求方式
点赞 + 关注 + 收藏 = 学会了
本文简介
之前讲 DRF 时都是用 GET 请求来讲解,其实 DRF 还提供了 POST、PUT、DELETE 等方法。只要在视图函数前面加一个装饰器说明一下可支持的请求方法即可。
动手试试
我们知道,路由地址一般写在 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"]) 描述这个方法接收 GET 和 POST 两种请求方法。
然后通过 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 不止支持函数视图,还支持类视图,下一篇文章再聊聊类视图怎么写。
点赞 + 关注 + 收藏 = 学会了

浙公网安备 33010602011771号