『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
不止支持函数视图,还支持类视图,下一篇文章再聊聊类视图怎么写。
点赞 + 关注 + 收藏 = 学会了