跳到主要内容

Django 中常用的第三方插件库介绍

今天我们会介绍在 Django 生态中比较火的一些第三方插件。正是这些插件,让我们开发网站变得如此简单。同时我会就一个热门的第三方框架谈一谈如何学习该框架的源码。接下来,让我们一起开始今天的学习吧。

1. Django 中常用的插件库

1.1 Django Rest Framework

Django Rest Framework 是一个强大且灵活的工具包,用以快速构建 Web API。为啥要使用它来构建 Web API呢?除了 DRF 可以在 Django 的基础上迅速实现 API 外,它自身还带有 WEB 的测试页面,可以方便的测试自己的 API。这点非常类似于 Java Web 开发中的 Swagger 插件,对于我们测试自己的 API 接口时非常有帮助的。

我们来总结 DRF 框架具备的一些特点:

  • 提供了定义序列化器 Serializer 的方法,可以快速根据 Django ORM 或者其他库自动序列化/反序列化;
  • 提供了丰富的类视图 和 Mixin 扩展类,可以进一步简化视图的编写;
  • 多种身份认证和权限认证方式的支持;
  • 内置了限流系统;
  • 直观的 API Web界面;
  • 可扩展性 , 插件丰富;
  • 完备的文档以及良好的社区支持
  • 诸多大厂(如 Mozilla, Red Hat 等)使用和点赞;

最后作为一个开源框架,查看下其项目 Github 地址时十分必要的。一个原则是:stars 越多,项目越火,可以放心使用。

图片描述

项目的地址和文档如下:

可以看到,无论是从 star 数还是 contributor 人数上看, DRF 都可以称为是热门框架了。大部分做 Django 开发的都会使用 DRF 这个插件,用于开发高质量的 Web API,这个框架也是我们后面学习和研究的重点。

1.2 Django Celery

首先介绍下 Celery 模块,Celery 是一款非常简单、灵活、可靠的分布式系统,可用于处理大量消息,并且提供了一整套操作此系统的一系列工具。另外,Celery 是一款消息队列工具,可用于处理实时数据以及任务调度。官网给出了 Celery 如下四个特点:

  • 简单:开箱机用,维护简单,不需要使用配置文件;
  • 高可靠性:如果连接丢失或者出现故障,客户端进程会自动重试。一些 broker 会以主/主或者主/备的方式维持系统的高可靠性;
  • 快速:单个 Celery 进程每分钟内可以处理数百万个任务,往返的延迟在毫秒级别(使用RabbitMQ 做中间件,再加上一些优化的设置);
  • 灵活:几乎 Celery 的每个部分都可以自行扩展,如使用自定义池、序列化器,压缩方案、日志记录,调度程序,消费者,生产者,代理传输等等。

注意到基于 Django 框架构建的 Web 系统实际上是一个同步服务。这意味着当客户端发起一个请求时,后端只有在视图函数处理完后才会返回结果。如果这个请求背后要做的工作比较耗时,或者因为某种原因导致非常耗时,那么此时客户端会一直等待请求的响应,这非常影响用户体验。对于一个优秀的网站而言,良好的用户体验十分重要,这也说明了一个支持异步功能的第三方插件的重要性。为了能让 Django 搭建的 Web 系统支持这样的异步功能,于是 django-celery 便应运而生。

图片描述

django-celery项目之后也被移到 celery 下进行统一管理。它相比原 celery 项目在 star 数和贡献者数上要逊色不少。

图片描述

可以看到,Celery 模块火热程度可以媲美 DRF。而它不仅仅用在 Django 项目中,其它框架甚至个人项目中也常常使用 Celery 来完成异步场景的需求。

1.3 Django Guardian

上一节中我们介绍了 Django 的权限管理, 知道 Django 仅仅提供的是一种全局权限。这种简单的全局权限控制机制在很多场景下并不适用,因此需要引入另一种更细的权限机制:对象权限 (object permission)。所谓的 Object Permission 其实是一种对象颗粒度上的权限机制,它允许为每个具体对象授权 ,在 Django 中其实已经包含了 object permission 的模块,但没有具体实现,必须要使用第三方的插件完成相应的功能。django-guardian 是目前比较活跃的一个 django extension,提供了一种有效的 object permission 控制机制,与 django 原生机制一脉相承,而且能快速整合到 django-admin 中,十分推荐使用。

接下来继续看下它在 Github 上的表现:

图片描述

django-guardian 项目的地址和文档如下:

从更新的频率上看,django-guardian 项目还是非常活跃的,更新速度可能没有 Django 这样的大型框架频繁,但是还是保持着一定的迭代速度,是比较值得使用并花心思研究的。

1.4 Django Xadmin

Django Xadmin 是国内程序员 sshwsfc 基于 Django 打造的一款简单易用而且又好看的后台管理系统。官网宣传语便是:打造管理系统从未如此简单。其宣称的几个核心特点如下:

  • 基于 Bootstrap3,适合多种屏幕显示;
  • 内置功能丰富,除了基本的 CURD 功能外,还有丰富的插件功能,如数据的导出、书签、图表、图片相册等多种扩展功能;
  • 强大的插件系统,通过制作 Xadmin 插件可以扩展系统的任何一个功能点;
  • 完善的权限系统,可配置、可定制,安全可靠;

来看一看它的 Github 地址, 主要关注 star 和 contributor 人数。可以看到这个项目的火热程度和 DRF 项目相比还有点距离,在国产框架中已经算很不错的了。但是截止到2020年5月4日,看到的上次 commit 记录好像还是2019年4月份,项目似乎是停滞更新了。如果是生产环境的话,需要慎重考虑,但是作为学习使用,还是十分推荐的。

图片描述

2. 如何深入插件源码学习?

我们以 DRF 框架为例,聊一聊如何深入 DRF 框架的源码学习。首先肯定是下载稳定版本为 DRF 源码到本地,这是为了方便自己阅读代码。截止到2020年5月10日,DRF 的 Github 官方地址发布的最新版本为3.11.0,我们会用该版本的代码来进行相关的演示和说明。以下是 DRF-3.11.0 源代码截图,里面的代码量还是比较大的,不过相对于 Django 的代码而言就会少很多,我们前面能学习并跟踪 Django 框架的源码,拿下 DRF 源码自然也不在话下。

图片描述

一般而言,推荐学习一个 Django 第三方插件源码的过程如下:

  • 第一步:熟练使用 Django 框架以及熟悉 Django 框架源码。所有的 Django 第三方插件代码里会大量调用 Django 源码的类或者方法,并在其基础上进行扩展或者进一步创新。以我们必须先掌握 Django 的源码,才能继续学习 DRF 的源码;
  • 第二步:仔细阅读官方文档手册进行学习,掌握框架的基本用法
  • 第三步:通过官方文档,实战 DRF 框架;每次在用熟练 DRF 提供的类或者方法后,就可以对应地查看源码,并分析 DRF 背后所做的工作。每掌握一个模块的基本用法,就可以深入学习对应模块的源码,同时在源码中我们还可以发现该模块中的更多用法,然后再次实践,以加深对源码的理解

我们按照上面的过程来简单走一遍。首先我们前面对 Django 的几大模块的源码都有涉猎,算是满足了第一步要求。接下来我们用官方给的快速入门教程完成我们的第一次 Django REST framework 框架的初体验。

  • 模型序列化器:给会员表 member 添加一个序列化器类,放到新建的 serializers.py 文件中。
from rest_framework import serializers
from hello_app.models import Member

class MemberSerializer(serializers.ModelSerializer):
class Meta:
model = Member
fields = ("id", "name", "age", "sex", "occupation", "phone\_num", "email", "city", "vip\_level\_id")


  • 准备 View 视图:添加一个对会员表操作的视图类,我们用最简单的形式即可。
# 代码位置:hello\_app/views.py
# ...

from rest_framework import viewsets
from rest_framework import permissions

# ...


class MemberViewSet(viewsets.ModelViewSet):
# 设置queryset
queryset = Member.objects.all().order_by('-register\_date')
# 设置序列化器
serializer_class = MemberSerializer
# 设置认证器
permission_classes = [permissions.IsAuthenticated]

  • 编写 URLConf 配置:Django REST framework 框架改良了 URLConf 配置的写法,后面会研究这种写法,先直接使用官方的示例即可。
# 代码位置:hello\_app/urls.py
# ...
from rest_framework import routers

router = routers.DefaultRouter()
router.register(r'members', views.MemberViewSet)

urlpatterns = [
# ...
path('', include(router.urls))
]

另外,由于我们对 MemberViewSet 视图加上了认证,所以必须要在入口的 urls.py 中上如下的 URLConf 的配置。

# 代码位置: first\_django\_app/urls.py
# ...

urlpatterns = [
# ...
path('api-auth/', include('rest\_framework.urls', namespace='rest\_framework'))
]


注意:不添加和添加这行 URLConf 配置的效果图如下所示。

图片描述

图片描述

  • 接下来,最后一步是设置视图的相关配置以及注册 rest_framework 应用。
# 代码位置:first\_django\_app/settings.py
# ...

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 注册第三方应用
'rest\_framework',
# 注册应用
'hello\_app'
]

REST_FRAMEWORK = {
'DEFAULT\_PAGINATION\_CLASS': 'rest\_framework.pagination.PageNumberPagination',
'PAGE\_SIZE': 5
}

# ...


  • 最后我们启动服务,来一起看看效果。我们之前创建过一个超级用户admin/admin.1234!,接下来会用这个通过 DRF 的认证。