关于 djangorestframework记录三篇:APIView

继:https://blog.csdn.net/ak739105231/article/details/110562811

一、APIView之request

-----------------------------------View获取数据方式:
   GET:
        request.GET
   POST:
        request.POST
        request.body
-----------------------------------APIView获取数据方式:
   GET:
        reuqest.query_params
   POST:
        request.data

1.1 简单示例:1.url中as_view()的用法;2.views中类继承APIView;3.views中类中get\post的示例

---------------------------------------------------------views.py文件中:
from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView
#定义类,继承APIView
class BookAPIView(APIView):
    def get(self,request):
        print(request.query_params)
        return HttpResponse(request.query_params["name"])

    def post(self,request):
        print(request.data)
        return HttpResponse(request.data["name"])
----------------------------------------------------------urls.py文件中:
from django.urls import path
from app06 import views
urlpatterns = [
    path('books/', views.BookAPIView.as_view()),
]
-------------------------------------------------------------效果描述:
python manage.py runserver 运行project;
1.通过postman工具,使用get方式请求接口:http://127.0.0.1:8088/app06/books/?name=zhangsna&user=lisi
2.通过postman工具,使用post方式请求接口:http://127.0.0.1:8088/app06/books/

结果:两种方式分别调用BookAPIView里面的get、post函数,正确响应;

二、APIView之response

目的:可以使用response响应各种数据和状态(1.可以返回各种类型数据;2.可以配合状态码使用)

要使用rest_framework中的Response,而不是使用django中的http

from rest_framework.response import Response

示例:views.py文件中,简单的使用rest_framework中的Response,加上status状态码

from rest_framework.views import APIView
from rest_framework.response import Response   #使用rest_framework中的Response
from rest_framework import status  #加上状态码,
#定义类,继承APIView
class BookAPIView(APIView):
    def get(self,request):
        print(request.query_params)
        return Response(request.query_params)

    def post(self,request):
        print(request.data)
        return Response(request.data,status=status.HTTP_404_NOT_FOUND) ##加上状态码

postman发起post请求:根据views.py中类的post函数中的Response的数据响应,状态码:404

三、APIView实现列表视图(获取所有数据、新增一条数据)

目的:可以使用serializers序列化器和APIView对列表视图进行改写

-----------------------------------------------------------views.py-----------------------
from rest_framework.views import APIView
from rest_framework.response import Response   #使用rest_framework中的Response
from rest_framework import status  #加上状态码,
from app06.models import *
from app06.serializers import *

#2,序列化器和APIView实现列表视图
class BookListView(APIView):
    def get(self,request):
        books = BookInfo.objects.all()
        serializer = BookInfoModelSerializer(instance=books,many=True)#由于books多个对象,所以加上many=True
        return Response(serializer.data)
    def post(self,request):
        dict_data = request.data  #APIView获取数据
        serializer = BookInfoModelSerializer(data=dict_data) #反序列化data
        serializer.is_valid(raise_exception=True)   #校验
        serializer.save()    #入库
        return Response(serializer.data,status=status.HTTP_201_CREATED)
-----------------------------------------------------------urls.py-----------------------
from django.urls import path
from app06 import views
urlpatterns = [
    path('books/', views.BookAPIView.as_view()),
    path('booklist/', views.BookListView.as_view()),
]

postman发起post请求:根据views.py中类的post函数中的Response的数据响应,入库;

三、APIView实现详情视图(获取一条数据、修改一条数据,删除一条数据)

注意:这里展示了put\delete的写法;put请求在url及请求body中都有参数;获取方式:request.query_params、request.data

-----------------------------------------------------------views.py-----------------------
from rest_framework.views import APIView
from rest_framework.response import Response   #使用rest_framework中的Response
from rest_framework import status  #加上状态码,
from app06.models import *
from app06.serializers import *

#2,序列化器和APIView实现详情视图
class BookInfoView(APIView):
    def get(self,request):
        book = BookInfo.objects.get(id=request.query_params["book_id"])
        serializer = BookInfoModelSerializer(instance=book)#由于books多个对象,所以加上many=True
        return Response(serializer.data,status=status.HTTP_200_OK)

    def put(self,request):
        data_dict = request.data  #APIView获取数据
        book = BookInfo.objects.get(id=request.query_params["book_id"])
        serializer = BookInfoModelSerializer(instance=book,data=data_dict) #反序列化data
        serializer.is_valid(raise_exception=True)   #校验
        serializer.save()    #入库
        return Response(serializer.data,status=status.HTTP_200_OK)

    def delete(self,request):
        BookInfo.objects.get(id=request.query_params["book_id"]).delete()
        return Response(status=status.HTTP_200_OK)
-----------------------------------------------------------urls.py-----------------------
from django.urls import path
from app06 import views
urlpatterns = [
    path('books/', views.BookAPIView.as_view()),
    path('booklist/', views.BookListView.as_view()),
    path('bookinfo/', views.BookInfoView.as_view()),
]

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷凝娇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值