django开发之drf基本概念


类别:web开发   

发布时间:2019/09/02 11:29:42   更新时间:2020/07/31 19:50:12


本文讲述的环境:ubuntu、python3、virtualenv。

参考官网:https://www.django-rest-framework.org/

django-rest-framework是大名鼎鼎的基于django的api框架,开发者们又叫其为drf。

drf给出了api的一套规范,封装的比较深,使用起来有一些难度,但是理解了就很好用。

本文主要化繁为简,给出drf的关键概念,示例看其它文章。

 

安装

以下包是可选的:

*、Markdown(2.1.0+):- Markdown对可浏览API的支持。

【本文不涉及】

*、django-filter(1.0.1+):- 过滤支持。

【本文不涉及】

*、django-guardian(1.1.1+)- 对象级权限支持。

【本文少量涉及,不是主要内容】

django 目前权限两种:表级别,也是model,默认的表级别,add ,delete,change。对象(字段)级别,也是field。

*、coreapi(1.32.0+) - 架构生成支持。

【本文少量涉及,不是主要内容】

REST framework可以自动帮助我们生成接口文档。接口文档以网页的方式呈现。自动接口文档能生成的是继承自APIView及其子类的视图。

*、django-crispy-forms - 改进的HTML显示以进行过滤。美化form表单的作用。

【本文少量涉及,不是主要内容】

pip install djangorestframework

pip install django-guardian

 

序列化概念

(正向)序列化:从数据库里拿出来模型对象,进行转化,返回json给前端。

反(向)序列化:从前端接口拿到数据(json),进行转化,保存到数据库中。

 

数据库操作:

增:校验请求数据 -> 执行反序列化过程 -> 保存数据库 -> 将保存的对象序列化并返回

删:判断要删除的数据是否存在 -> 执行数据库删除

改:判断要修改的数据是否存在 -> 校验请求的数据 -> 执行反序列化过程 -> 保存数据库 -> 将保存的对象序列化并返回

查:查询数据库 -> 将数据序列化并返回

序列化调试

测试方法:
(env) python manage.py shell
from drf_app.serializers import UserSerializer
your_serializer = Your_TestSerializer()                
print(repr(your_serializer))

 

几种不同视图的方式和其优缺点

APIView类

REST框架提供了一个APIView类,它是Django View类的子类。

APIView类View通过以下方式与常规类不同:

传递给处理程序方法的请求将是REST框架的Request实例,而不是Django的HttpRequest实例。

处理程序方法可能会返回REST框架Response,而不是Django HttpResponse。该视图将管理内容协商并在响应上设置正确的渲染器。

任何APIException例外都将被捕获并调解为适当的响应。

将传入的请求进行身份验证,并在将请求分派给处理程序方法之前运行适当的权限和/或限制检查。

 

评价:如果通用视图不能满足你的需求,就用这个。

 

装饰器视图

REST框架还允许您使用基于常规功能的视图。它提供了一组简单的装饰器,它们包装基于函数的视图,以确保它们接收Request(而不是通常的Django HttpRequest)的实例并允许它们返回Response(而不是Django HttpResponse),并允许您配置请求的处理方式。

此功能的核心是api_view装饰器,它接收视图应响应的HTTP方法列表。

 

要覆盖默认设置,REST框架提供了一组可添加到视图中的其他装饰器。这些必须在@api_view装饰者之后(下面)。

 

评价:如果不是你非常执着喜欢装饰器形式,还是更推荐通用视图和APIView

 

通用视图

基于类的视图的一个主要好处是它们允许您组合可重用行为的方式。REST框架通过提供许多预先构建的视图来提供常用模式来利用这一点。

REST框架提供的通用视图允许您快速构建与您的数据库模型紧密相关的API视图。

如果通用视图不适合您的API需求,您可以直接使用常规APIView类,或者重用通用视图使用的mixins和基类来组成您自己的可重用通用视图集。

 

GenericAPIView

此类扩展了REST框架的APIView类,为标准列表和详细信息视图添加了常用的行为。

提供的每个具体通用视图是通过GenericAPIView与一个或多个mixin类组合而构建的。

 

GenericAPIView

类是一个重要的类,它应用了查询集、序列器类等等。

 

具体通用视图的使用,需要读api文档。

https://www.django-rest-framework.org/api-guide/generic-views/

 

评价:推荐使用。用于多数常用的api。

 

ViewSets

Django REST框架允许您在一个名为ViewSet的类中组合一组相关视图的逻辑。

ViewSet类只是一种基于类的视图类型,它不提供.get()或.post()等任何方法处理程序,而是提供.list()和.create()等操作。

视图集的方法处理程序仅在完成视图时使用.as_view()方法绑定到相应的操作。

通常,您不会显式地在urlconf的viewset中注册视图,而是将视图集注册到router类,它会自动为您确定urlconf。

 

使用ViewSet类比使用View类有两个主要优点:

重复逻辑可以组合成一个类。在上面的示例中,我们只需要指定queryset一次,它将在多个视图中使用。

通过使用路由器,我们不再需要处理自己的URL连接。

这两个都需要权衡。

使用常规视图和URL confs更明确,并为您提供更多控制。如果您希望快速启动并运行,或者您拥有大型API并希望在整个过程中强制执行一致的URL配置,则ViewSet非常有用。

 

使用ViewSet视图集可能是一个非常有用的抽象。它有助于确保URL约定在您的API中保持一致,最大限度地减少您需要编写的代码量,并使您可以专注于API提供的交互和表示,而不是URL conf的细节。

这并不意味着它始终是正确的方法。在使用基于类的视图而不是基于函数的视图时,需要考虑类似的一组权衡。使用视图集不如单独构建视图那么明确。

 

评价:个人不太推荐使用ViewSet视图集。

1、大量api,统一过程,代表了这些api其实可以归一,如果不能归一那么整体一起处理可能会有很多bug。

2、在django路由体系之外,又加了一套附加路由。

 

认证

认证是将传入请求与一组标识凭据(例如请求来自的用户或其签名的令牌)相关联的机制。然后,权限限制策略可以使用这些凭据来确定是否应该允许该请求。

REST框架提供了许多开箱即用的身份验证方案,还允许您实现自定义方案。

身份验证始终在视图的最开始,在发生权限和限制检查之前,以及允许任何其他代码继续之前运行。

https://www.django-rest-framework.org/api-guide/authentication/

官方推荐,认证用OAuth 2.0支持包:Django OAuth Toolkit

这个在本系列的其它文章上有介绍。

 

权限

身份验证限制一起,权限确定是应该授予还是拒绝访问请求。

https://www.django-rest-framework.org/api-guide/permissions/

需要注意的是,基于model的对象级的权限,比如:DjangoObjectPermissions,要使用此权限类,您还需要添加支持对象级权限的权限后端django-guardian

 

drf开始使用

官网上推荐,drf作为一个django的app开始。这个我们前边有介绍。基本方式是:

进入你的django项目根目录(manage.py所在目录)

django-admin startapp your_drf

 


本文网址:https://www.pyfield.com/blog/?id=25