设为首页 收藏本站
查看: 696|回复: 3

Django-drf中详解Request对象和Response对象、初始GenericAPIView

[复制链接]
累计签到:504 天
连续签到:1 天
发表于 2022-12-22 00:15:18 | 显示全部楼层 |阅读模式
# 面向对象封装和继承的区别
1、封装可以self.里面属性取值,
2、但是你想把某个方法隐藏起来可以用self.__方法这样就不会给别人用了,
3、还有是self._可以让外部引用,但是不希望外部用

# 1、请求和响应
# 1.1 请求Request
# 请求对象对应参数意思
1from rest_framework.request import Request
        def
__init__(self, request, parsers=None, authenticators=None,
                     negotiator=None, parser_context=None):
            #
二次封装request,将原生request作为drf request对象的 _request 属性
            self._request = request
        def
__getattr__selfitem):
            return getattr(self._request,item)
2
[请求对象.data:前端以三种编码方式传入的数据,都可以取出来-
3
[请求对象..query_params Django标准的request.GET相同,只是更换了更正确的名称而已。]

# 2、响应Response
# 2.1 响应
from rest_framework.response import Response
def
__init__(self, data=None, status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None):
1
data:你要返回的数据,字典 render处理前可以拿到,是字典
2status:返回的状态码,默认是200
   -from rest_framework import status在这个路径下,它把所有使用到的状态码都定义成了常量
template_name 渲染的模板名字(自定制模板),不需要了解
3headers:响应头,可以往响应头放东西,就是一个字典
4[Django源生如何向head放东西,直接用HttpResponse[{token:'qwe']]
5
content_type:响应的编码格式,application/jsontext/html; render处理后数据是一对字符串,然后给HttpResponse处理

# 浏览器响应成浏览器的格式,postman响应成json格式,通过配置实现的(默认配置)
不管是postman还是浏览器,都返回json格式数据
[drf有默认的配置文件---》先从项目的setting中找,找不到,采用默认的-
[drf的配置信息,先从自己类中找--》项目的setting中找---》默认的找]
   -局部使用:对某个视图类有效
        -在视图类中写如下
        from rest_framework.renderers import JSONRenderer
        renderer_classes=
[JSONRenderer,]
    -全局使用:全局的视图类,所有请求,都有效
       -setting.py中加入如下
        REST_FRAMEWORK = {
            'DEFAULT_RENDERER_CLASSES': (  #
默认响应渲染类
                'rest_framework.renderers.JSONRenderer',  # json渲染器
                'rest_framework.renderers.BrowsableAPIRenderer',  # 浏览API渲染器
            )
        }

# 5种请请求方法
from rest_framework.generics import GenericAPIView
from app01.models import Book
from app01.ser import BookSerializer
# 基于APIView写的
路由:path('books/', views.BookView.as_view()),
class BookView(APIView):
    def get(self,request):
[        book_list=Book.objects.all()
        book_ser=BookSerializer(book_list,many=True)]
        return Response(book_ser.data)
    def post(self,request):
        book_ser = BookSerializer(data=request.data)
        if book_ser.is_valid():
            book_ser.save()  
book_ser用的orm中的保存所有不用重写方法
            return Response(book_ser.data)
        else:
            return Response({'status':101,'msg':'
校验失败'})

路由:re_path('books/(?P<pk>\d+)', views.BookDetailView.as_view()),
class BookDetailView(APIView):
    def get(self, request,pk):
        book = Book.objects.all().filter(pk=pk).first()
        book_ser = BookSerializer(book)
        return Response(book_ser.data)
    def put(self, request,pk):
        book = Book.objects.all().filter(pk=pk).first()
        book_ser = BookSerializer(instance=book,data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status': 101, 'msg': '
校验失败'})
    def delete(self,request,pk):
        ret=Book.objects.filter(pk=pk).delete()
        return Response({'status': 100, 'msg': '
删除成功'})
# 基于GenericAPIView写的
class Book2View(GenericAPIView):
[    #queryset要传queryset对象,查询了所有的图书
    # serializer_class使用哪个序列化类来序列化这堆数据,源码所得后面会自动加.all()所以可以将简写
    queryset=Book.objects
    # queryset=Book.objects.all()
    serializer_class = BookSerializer]
    def get(self,request):
        book_list=self.get_queryset()
        book_ser=self.get_serializer(book_list,many=True)
        return Response(book_ser.data)
    def post(self,request):
        book_ser = self.get_serializer(data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status':101,'msg':'
校验失败'})

# 基于GenericAPIView写的Publish5个接口
from app01.models import Publish
from app01.ser import PublishSerializer
class Publish2View(GenericAPIView):
[    #queryset要传queryset对象,查询了所有的图书
    # serializer_class使用哪个序列化类来序列化这堆数据
    queryset=Publish.objects
    # queryset=Book.objects.all()
    serializer_class = PublishSerializer]
    def get(self,request):
        book_list=self.get_queryset()
        book_ser=self.get_serializer(book_list,many=True)
        return Response(book_ser.data)
    def post(self,request):
        book_ser = self.get_serializer(data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status':101,'msg':'
校验失败'})

class Publish2DetailView(GenericAPIView):
[    queryset = Publish.objects
    serializer_class = PublishSerializer]
    def get(self, request,pk):
        book = self.get_object()
        book_ser = self.get_serializer(book)
        return Response(book_ser.data)
    def put(self, request,pk):
        book = self.get_object()
        book_ser = self.get_serializer(instance=book,data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status': 101, 'msg': '
校验失败'})
    def delete(self,request,pk):
        ret=self.get_object().delete()
        return Response({'status': 100, 'msg': '
删除成功'})

class Book2DetailView(GenericAPIView):
[    queryset = Book.objects
    serializer_class = BookSerializer]
    def get(self, request,pk):
        book = self.get_object()
        book_ser = self.get_serializer(book)
        return Response(book_ser.data)
    def put(self, request,pk):
[        book = self.get_object()
        book_ser = self.get_serializer(instance=book,data=request.data)]
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status': 101, 'msg': '
校验失败'})
    def delete(self,request,pk):
        ret=self.get_object().delete()
        return Response({'status': 100, 'msg': '
删除成功'})


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-1003419-1-1.html 上篇帖子: 初始Django序列化组件Serializer 下篇帖子: Django中drf的自动生成路由和认证源码刨析
累计签到:504 天
连续签到:1 天
 楼主| 发表于 2022-12-23 20:06:13 | 显示全部楼层
### 2.3 基于GenericAPIView和5个视图扩展类写的接口


from rest_framework.mixins import  ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin
# views.py
class Book3View(GenericAPIView,ListModelMixin,CreateModelMixin):

    queryset=Book.objects
    serializer_class = BookSerializer
    def get(self,request):
        return self.list(request)

    def post(self,request):
        return self.create(request)

class Book3DetailView(GenericAPIView,RetrieveModelMixin,DestroyModelMixin,UpdateModelMixin):
    queryset = Book.objects
    serializer_class = BookSerializer
    def get(self, request,pk):
        return self.retrieve(request,pk)

    def put(self, request,pk):
        return self.update(request,pk)

    def delete(self,request,pk):
        return self.destroy(request,pk)
# urls.py
    # 使用GenericAPIView+5 个视图扩展类  重写的
    path('books3/', views.Book3View.as_view()),
    re_path('books3/(?P<pk>\d+)', views.Book3DetailView.as_view()),

### 3.5 源码分析ViewSetMixin

# 重写了as_view
# 核心代码(所以路由中只要配置了对应关系,比如{'get':'list'}),当get请求来,就会执行list方法
for method, action in actions.items():
    #method:get
    # action:list
    handler = getattr(self, action)
    #执行完上一句,handler就变成了list的内存地址
    setattr(self, method, handler)
    #执行完上一句  对象.get=list
    #for循环执行完毕 对象.get:对着list   对象.post:对着create


### 3.6 继承ViewSetMixin的视图类
# views.py
from rest_framework.viewsets import ViewSetMixin
class Book6View(ViewSetMixin,APIView): #一定要放在APIVIew前
    def get_all_book(self,request):
        print("xxxx")
        book_list = Book.objects.all()
        book_ser = BookSerializer(book_list, many=True)
        return Response(book_ser.data)
# urls.py
    #继承ViewSetMixin的视图类,路由可以改写成这样
    path('books6/', views.Book6View.as_view(actions={'get': 'get_all_book'})),

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

回复 支持 反对

使用道具 举报

累计签到:11 天
连续签到:1 天
发表于 2023-9-21 15:44:58 | 显示全部楼层
都是人家写好的    你要看的懂人家的逻辑  和使用就行

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表