Django REST Framework(三)DRF

核心思想: 大量缩减编写api接口的代码

Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用。在REST framework中,提供了序列化器Serialzier的定义,可以帮助我们简化序列化与反序列化的过程,不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。REST framework还提供了认证、权限、限流、过滤、分页、接口文档等功能支持。REST framework提供了一个API 的Web可视化界面来方便查看测试接口。

中文文档:主页 - Django REST framework中文站点

github: GitHub - encode/django-rest-framework: Web APIs for Django. 🎸

特点:

  • 提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;

  • 提供了丰富的类视图、Mixin扩展类,简化视图的编写;

  • 丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;

  • 多种身份认证和权限认证方式的支持;[jwt]

  • 内置了限流系统;

  • 直观的 API web 界面;【方便我们调试开发api接口】

  • 可扩展性,插件丰富

环境安装与配置

DRF需要以下依赖:

  • Python (3.5 以上)

  • Django (2.2 以上)

DRF是以Django子应用的方式提供的,所以我们可以直接利用已有的Django环境而无需从新创建。(若没有Django环境,需要先创建环境安装Django)

前提是已经安装了django,建议安装在虚拟环境

DRF的APIView视图

  • APIView的简单使用
    • APIView是REST framework提供的所有视图的基类,继承自Django的View父类。

      相较于CBV,路由不变,视图不变,继承类改为APIView

      class BookView(APIView):
      
          def get(self, request):
              return HttpResponse("APIView:get请求book")
      
          def post(self, request):
              return HttpResponse("APIView:post请求book")

  • APIview源码解析
  • '''
    class BookView(APIView):
    
        def get(self, request):
            return HttpResponse("APIView:get请求book")
    
        def post(self, request):
            return HttpResponse("APIView:post请求book")
    
    
    class APIView(View):
    
        @classmethod
        def as_view(cls):
            view = super().as_view()
            view.cls = cls
            return view
        
        def dispatch(self, request):
            # (1)构建新的request对象
            request = self.initialize_request(request, *args, **kwargs)
            self.request = request
            # (2)认证、权限、限流组件三件套
            self.initial(request, *args, **kwargs)
            # (3)分发
            handler = getattr(self, request.method.lower()) # 按请求方式分发       
            return handler(request, *args, **kwargs)
            
            
    class View:
        @classonlymethod
        def as_view(cls):
        
            def view(request):
                self = cls()
                return self.dispatch(request, *args, **kwargs)
                
            return view
                
     
        def dispatch(self, request):
            
            handler = getattr(self, request.method.lower()) # 按请求方式分发       
            return handler(request, *args, **kwargs)
        
       
    # 路由
    path('book/', views.BookView.as_view()),
    path('book/', View.view),
    
    # 一旦用户发起请求,比如get请求访问/book/,依然得到get方法的响应
    get请求访问/book/ => View.view()  =>   APIView.dispatch()  =>  BookView.get()  
    
    '''
  • APIViewView的不同之处在于:
    • 传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象;

    • 视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端期望要求的格式;

    • 任何APIException异常都会被捕获到,并且处理成合适格式的响应信息返回给客户端;

    • 重新声明了一个新的as_views方法并在dispatch()进行路由分发前,会对请求的客户端进行身份认证、权限检查、流量控制。

  • DRF在django原有的基础上,新增了一个request对象继承到了APIVIew视图类,并在django原有的HttpResponse响应类的基础上实现了一个子类rest_framework.response.Response响应类。这两个类,都是基于内容协商来完成数据的格式转换的。
    • request->parser->识别客户端请求头中的Content-Type来完成数据转换成->类字典(QueryDict,字典的子类)

    • response->renderer->识别客户端请求头的"Accept"来提取客户单期望的返回数据格式,-> 转换成客户端的期望格式数

 

  • 33
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值