drf框架相关

drf框架: django-rest framework

1.接口:联系两个物质的媒介,完成信息交互
    web程序中:联系前台页面与后台数据库的媒介,已完成信息的交互;
    web接口组成:
        url:长得像放回数据的url链接
        请求参数:前台按照指定的key提供数据给后台
        响应数据:后台与数据库交互后将数据反馈给前台
2.restful接口规范 -> 规范化书写接口
    定义:为了采用不同的后台语言,也能用同样的接口来获取到同样的数据;
    接口文档: 写接口要写 url,响应数据
        注:如果将请求参数也纳入考量范围,那就是写接口文档

    .url:
        1.用api关键字标识接口url     eg:api.baidu.com | www.baidu.com/api
        2.接口数据安全性决定优先选择https协议
        3.如果一个接口有多版本存在,需要在url中标识提现
           eg:    api.baidu.com/v1/...   | api.baidu.com/v2/...
        4.接口操作的数据源称之为资源,在url中一般采用资源复数形式,
          一个接口可以概括对该资源的多种操作方式
          api.baidu.com/books | api.baidu.com/books/(pk)
        5.请求方式有多种,如何用一个url处理保证不混乱?
          --通过请求方式标识操作资源的方式
              /books        get            获取所有
            /books        post        增加一个(多个)
            /books/(pk)    delete        删除一个
            /books/(pk)    put            整体更新一个
            /books/(pk)    patch        局部更新一个

        6.资源往往涉及数据的各种操作方式 --筛选,排序,限制
            eg: api.baidu.com/books/?search=系&ordering=price&limit=3

    .响应数据:
        1.http请求的响应会有不同的状态码,接口用来返回操作的资源数据
            status  0(操作资源成功)  1(操作资源失败)  2(操作资源成功,但没匹配结果)
            注:资源状态码不像http状态码,一般都是后台与前台约定的
        2.资源的状态码文字提示
            status  ok  子账号有误‘   ‘密码有误‘   ‘用户锁定‘
        3.资源本身
            results
            注: 删除资源成功不做任何数据返回

        4.不能直接放回的资源(子资源,图片,视频),返回资源的链接
3.cbv生命周期源码  --基于restful规范下的cbv接口
基础接口:
    #主路由:url.py
        from django.conf.urls import url, include
        from django.contrib import admin
        urlpatterns = [
            url(r‘^admin/‘, admin.site.urls),
            # 路由分发
            url(r‘^api/‘, include(‘api.urls‘))
        ]
    #api组件的子路由:api/url.py
        from django.conf.urls import url
        from . import views
        urlpatterns = [
            url(r‘^books/‘, views.Book.as_view()),
            url(r‘^books/(?P<pk>.*)/$‘, views.Book.as_view()),
        ]
    #模型层:model.py
        from django.db import models
        class Book(models.Model):
            title = models.CharField(max_length=64)
            price = models.DecimalField(max_digits=5, decimal_places=2)
            class Meta:
                db_table = ‘old_boy_book‘
                verbose_name = ‘书籍‘
                verbose_name_plural = verbose_name
            def __str__(self):
                return ‘《%s》‘ % self.title
    #后台层:admin.py
        from django.contrib import admin
        from . import models
        admin.site.register(models.Book)

    #数据库迁移
         python manage.py makemigrations
         python manage.py migrrate
         #注册超级管理员
         python manage.py createsuperuser
    #视图层:views.py
        from django.http import JsonResponse
        from django.views import View
        from . import models
            class Book(View):
                def get(self, request, *args, **kwargs):
                    pk = kwargs.get(‘pk‘)
                    if not pk:  # 群查
                        # 操作数据库
                        book_obj_list = models.Book.objects.all()
                        # 序列化过程
                        book_list = []
                        for obj in book_obj_list:
                            dic = {}
                            dic[‘title‘] = obj.title
                            dic[‘price‘] = obj.price
                            book_list.append(dic)
                        # 响应数据
                        return JsonResponse({
                            ‘status‘: 0,
                            ‘msg‘: ‘ok‘,
                            ‘results‘: book_list
                        }, json_dumps_params={‘ensure_ascii‘: False})
                    else:  # 单查
                        book_dic = models.Book.objects.filter(pk=pk).values(‘title‘, ‘price‘).first()
                        if book_dic:
                            return JsonResponse({
                                ‘status‘: 0,
                                ‘msg‘: ‘ok‘,
                                ‘results‘: book_dic
                            }, json_dumps_params={‘ensure_ascii‘: False})
                        return JsonResponse({
                            ‘status‘: 2,
                            ‘msg‘: ‘无结果‘,
                        }, json_dumps_params={‘ensure_ascii‘: False}
    1.获取一个
    2.获取所有
    3.增加一个
    4.删除一个
    5.整体更新一个
    6.局部更新一个
    群增|群删|整体改群改|局部改群
        def get(self, request, *args, **kwargs):
            pk = kwargs.get(‘pk‘)
            if not pk:  # 群查
                # 操作数据库
                book_obj_list = models.Book.objects.all()
                # 序列化过程
                book_list = []
                for obj in book_obj_list:
                    dic = {}
                    dic[‘title‘] = obj.title
                    dic[‘price‘] = obj.price
                    book_list.append(dic)
                # 响应数据
                return JsonResponse({
                    ‘status‘: 0,
                    ‘msg‘: ‘ok‘,
                    ‘results‘: book_list
                }, json_dumps_params={‘ensure_ascii‘: False})
            else:  # 单查
                book_dic = models.Book.objects.filter(pk=pk).values(‘title‘, ‘price‘).first()
                if book_dic:
                    return JsonResponse({
                        ‘status‘: 0,
                        ‘msg‘: ‘ok‘,
                        ‘results‘: book_dic
                    }, json_dumps_params={‘ensure_ascii‘: False})
                return JsonResponse({
                    ‘status‘: 2,
                    ‘msg‘: ‘无结果‘,
                }, json_dumps_params={‘ensure_ascii‘: False})

Postman接口工具:
postman可以完成不同方式的请求: get|post|put...
get请求,携带参数采用Params,
post请求提交数据包有三种方式:form-data | urlencoding | json
原生django对urlencoding方式数据兼容最好
    def post(self, request, *args, **kwargs):
        # 前台通过urlencoding方式提交数据
        try:
            book_obj = models.Book.objects.create(**request.POST.dict())
            if book_obj:
                return JsonResponse({
                    ‘status‘: 0,
                    ‘msg‘: ‘ok‘,
                    ‘results‘: {‘title‘: book_obj.title, ‘price‘: book_obj.price}
                }, json_dumps_params={‘ensure_ascii‘: False})
        except:
            return JsonResponse({
                ‘status‘: 1,
                ‘msg‘: ‘参数有误‘,
            }, json_dumps_params={‘ensure_ascii‘: False})

        return JsonResponse({
            ‘status‘: 2,
            ‘msg‘: ‘新增失败‘,
        }, json_dumps_params={‘ensure_ascii‘: False})

DRF框架:
    安装: pip install djangorestframework
    drf框架规矩的封装风格:
        from rest_framework.views import APIView
        from rest_framework.response import Pesponse
        from rest_framework.request import Request
        from rest_framework.serializers import Serializer
        from rest_framework.settings import APISettings
        from rest_framework.filters import SearchFilter
        from rest_framework.pagination import PageNumberPagination
        from rest_framework.authentication import TokenAuthentication
        from rest_framework.permissions import IsAuthenticated
        from rest_framework.throttling import SimpleRateThrottle

    class Test(APIView):
        def get(self, request, *args, **kwargs):
            return Response(‘drf get ok‘)

    drf请求生命周期:
        1.请求走的是APVIiew 的 as_view函数
        2.在APIView的 as_view 调用父类(django原生)的as_view,还禁用了 csrf 认证
        3.在父类的 as_view中dispatch方法请求走的又是APIV接我的dispatch
        4.完成任务方法交给视图类的请求函数处理,得到请求的响应结果,返回给前台

    请求模块: request对象:
        源码入口:APIView类的dispatch方法中:
        源码分析:
            #二次封装得到def的request对象
            request = self.initialize_request(request,*args,**kwargs)
            #在rest_framework.request.Request实例化方法中
            self_request = request 将request作为新request的_request属性
            #在rest_framework.request.Request的__getattr__方法中
            try:
                return getattr(self._request,attr) #访问属性完全兼容原生request
            except AttributeError:
                return self.__getattrigute__(attr)

        小结:
            1.drf对原生request做了二次封装,request._request就是原生request
            2.原生request对象的属性和方法都可以被drf的request对象直接访问(兼容)
            3.drf请求的所有url拼接参数均被解析到query_params中,所有数据包数据都被解析到data中 

        class Test(APIView):
            def get(self, request, *args, **kwargs):
                # url拼接的参数
                print(request._request.GET)  # 二次封装方式
                print(request.GET) # 兼容
                print(request.query_params) # 拓展

                return Response(‘drf get ok‘)

            def post(self, request, *args, **kwargs):
                # 所有请求方式携带的数据包
                print(request._request.POST)  # 二次封装方式
                print(request.POST)  # 兼容
                print(request.data)  # 拓展,兼容性最强,三种数据方式都可以

                print(request.query_params)

                return Response(‘drf post ok‘)

    渲染模块:浏览器和Postman请求结果渲染数据的方式不一样
        源码入口:APIView类的dispatch方法中:self.response = self.finalize_response(request, response, *args, **kwargs)
        源码分析:
            #解析reponse对象数据
            self.response = self.finalize_response_response(request,response,*args,**kwargs)点进去
            #拿到运行的解析类的对象萌:
            neg = self.perform_content_negotiation(request,force=True) 点进去
            #获取解析类对象
            renderers = self.get_genderers() 点进去
            #从视图类中得到renderer_classes请求类,如何实例化一个个对象形参解析类对象列表
            return [renderer() for renderer in self.renderer_classes]

    重点:self.renderer_classes获取renderer_rendererd_classes的顺序
        1.自己视图类的类属性(局部配置) =>
        2.APIView类的类属性设置 =>
        3.自己配置文件的DEFAULT_RENDERER_CLASSES(全局配置) =>
        4.drf配置文件的DEFAULT_RENDERER_CLASSES

    全局配置:所有视图类统一处理,在项目的settings.py中
        REST_FRAMEWORK = {
            # drf提供的渲染类
            ‘DEFAULT_RENDERER_CLASSES‘: [
                ‘rest_framework.renderers.JSONRenderer‘,
                ‘rest_framework.renderers.BrowsableAPIRenderer‘,
            ],
        }
    局部配置:某一个或一些实体类单独处理,在views.py视图类中提供对应的类属性
        from rest_framework.renderers import JSONRenderer
        class Test(APIView):
            def get(self, request, *args, **kwargs):
                return Response(‘drf get ok‘)

            def post(self, request, *args, **kwargs):
                return Response(‘drf post ok‘
        class Test2(APIView):
            # 局部配置
            renderer_classes = [JSONRenderer]
            def get(self, request, *args, **kwargs):
                return Response(‘drf get ok 2‘)

            def post(self, request, *args, **kwargs):
                return Response(‘drf post ok 2‘)

4.请求组件,解析组件,响应组件
5.序列化组件(灵魂)
6.三大认证(*****************)
    --认证,权限(权限六表),频率
7.其他组件:过滤,筛选,排序,分页,路由
    注:难点在源码分析

原文地址:https://www.cnblogs.com/wyf20190411-/p/11674054.html

时间: 2024-10-08 16:49:59

drf框架相关的相关文章

django drf框架中的user验证以及JWT拓展的介绍

登录注册是几乎所有网站都需要去做的接口,而说到登录,自然也就涉及到验证以及用户登录状态保存,最近用DRF在做的一个关于网上商城的项目中,引入了一个拓展DRF JWT,专门用于做验证和用户状态保存.这个拓展比传统的CSRF更加安全.先来介绍一下JWT认证机制吧! Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景.JWT的声明一般被用来在身

drf框架中jwt认证,以及自定义jwt认证

0909自我总结 drf框架中jwt 一.模块的安装 官方:http://getblimp.github.io/django-rest-framework-jwt/ 他是个第三方的开源项目 安装:pip install djangorestframework-jwt 使用自带设定好的jwt from django.urls import path from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [ path(

DRF框架之视图集(ModelViewSet)简介

DRF框架中,一共有三个视图集类,我们这里只说明ModelViewSet一个. ModelViewSet是封装度最高的DRF的视图类.包含了怎删改查中的所有接口操作. 它继承自GenericViewSet.ListModelMixin.RetrieveModelMixin.CreateModelMixin.UpdateModelMixin.DestoryModelMixin. 所以,在使用ModelViewSet定义API时,我们只需要套用模板即可. 使用视图集,可以将一系列逻辑相关的动作放到一

DRF框架知识总览

DRF框架知识总览 """ 1)接口(api): 什么是接口 接口文档 接口规范 2)FBV => CBV:Function|Class Base View CBV的请求生命周期 CBV比FBV的优势 3)drf框架的基础试图类 APIView:请求模块.解析模块.渲染模块.响应模块.异常模块 4)drf核心组件 序列化组件:将后台的任何数据,进行序列化返回给前台:将前台的数据反序列化成后台model对象再入库 三大认证组件:认证组件.权限组件(RBAC).频率组件 视

drf框架, 接口(api) Django FBV =&gt; CBV drf框架的基础试图类 drf核心组件 群查与单查 python换源

接口 """ 接口概念:前台与后台进行信息交互的媒介 - url链接 接口组成: url链接 - 长得像返回数据的url链接 请求方式 - get(查).post(增).put(整体改).patch(局部改).delete(删) 请求参数 - 拼接参数.数据包参数(urlencoded.form-data.json) 响应结果 - 响应的json数据 """ 开发阶段接口测试工具 """ Postman: 官网下载.

iOS OpenGLES 框架相关 24 篇文档排序整理

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. OpenGLES Use a compact, efficient subset of the OpenGL API for 2D and 3D

Storm分布式实时流计算框架相关技术总结

Storm分布式实时流计算框架相关技术总结 Storm作为一个开源的分布式实时流计算框架,其内部实现使用了一些常用的技术,这里是对这些技术及其在Storm中作用的概括介绍.以此为基础,后续再深入了解Storm的内部实现细节. 1. Zookeeper集群 Zookeeper是一个针对大型分布式系统的可靠协调服务系统,其采用类似Unix文件系统树形层次结构的数据模型(如:/zoo/a,/zoo/b),节点内可存储少量数据(<1M,当节点存储大数据量时,实际应用中可能出现同步问题). Zookeep

DRF框架之 serializers 序列化组件

1. 什么是序列化,其实在python中我们就学了序列化工具json工具,就是吧信息存为类字典形式 2. DRF框架自带序列化的工具: serializers 3. DRF框架 serializers 分为:第一种 Serializer   第二种 ModelSerializer 第一种用法之 Serializer from django.db import models # Create your models here. class Book(models.Model): nid = mod

DRF框架中其他功能:认证、权限、限流

定义视图时,只要视图继承了APIView或其子类,就可以使用DRF框架的认证.权限和限流功能. 当客户端访问API接口时,DRF框架在调用对应的API接口之前,会依次进行认证.权限和限流的操作. 认证Authentication 权限Permissions 限流Throttling 原文地址:https://www.cnblogs.com/oklizz/p/11290731.html