核心思想: 大量缩减编写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() '''
-
APIView
与View
的不同之处在于:-
传入到视图方法中的是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"来提取客户单期望的返回数据格式,-> 转换成客户端的期望格式数
-