这几个库让 Django Web 开发事半功倍

6,007 阅读6分钟

前言

Django 是 Python 语言开发的 Web 框架,因其功能强大,开发快速而广受欢迎。在 Github 上更是收获了 47K+ 的 Star,其社区和周边库也极其活跃,下面我就来分享一些我工作中经常使用的库,用好了事半功倍,大大增加开发效率,3 小时干一天的活,剩下时间可以好好划水(学习)!

除了列举,我还会结合实际使用情况作使用演示,方便大家根据需要筛选。以下内容较长,建议先收藏再看。

本文所有库均在 Django 2.1 以上实测过,部分库在 Django 1.11 以上都可以使用。

正文

Django Rest Framework

Django Rest Framework 是我最最推荐的,也是我开发 Django 服务的必用库。也许它的知名度已经足够大,不需要我展开介绍了,我就简单介绍下它的使用(详细的也不够写😂)

Django Rest Framework 给 Django 提供了一套 Restful 规范的 API,并提供了配套的一系列功能,如认证、鉴权、限速等,同时还提供了 UI 的测试界面。

pip install djangorestframework

结合 Django 的 Model,开发一个 Restful API 只需要 3 步。

1.1 创建 Model 的序列化类 Serializer

Serializer 是序列化类,用于 Model 对象和 API Json 结构的相互转换。最简单的实现如下所示。

基本的 Model Field 都有对应的 Serializer Field 自动映射,无需额外编写。同时还提供了一些特殊的 Field,如外键 ID 转换成其他字段,甚至可以在序列化时将整个关联对象引入。

1.2 创建视图 View

视图分为三类:方法视图,类视图,基于 Model 的 ViewSet。

a) 方法视图

方法视图就是一个方法,类似与 Django 的方法视图,只是加个装饰器就行了。

方法 api_view 的参数可以限定 Http 方法,默认是 GET,最后返回 Response 对象即可。

b) 类视图

类视图就是将 Http 方法映射到类的方法上。

c) ViewSet 视图

ViewSet 视图更简单,直接可以绑定 Model 和视图。

1.3 绑定路由

最后绑定路由就可以访问了。

可以用 Django 的 path 绑定或者用 router 对象。

还有其他的认证、鉴权、限速等强大功能,内容太多,这里就不展开了。

django-filter

这个库给 Django API 提供了筛选功能,配合 Rest Framework 使用,可以一行代码提供模型的强大筛选 API。

pip install django-filter

然后可以通过 URL 参数进行筛选。

http://example.com/api/users/1/?name=huoyan&age=20

Django CORS Headers

对于前后端分离的架构,后端 API 需要添加 CORS 相应头以提供跨域访问功能。可以自行在相应的每个 Header 中添加,当然现成的轮子有了,何乐而不为?

pip install django-cors-headers

使用非常简单,只要添加 installed_appmiddlewares 就可以了。

同时提供了自定义的配置功能,可直接在 Django 的 settings 里配置。

CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
    'VIEW',
)

CORS_ALLOW_HEADERS = (
    'XMLHttpRequest',
    'X_FILENAME',
    'accept-encoding',
    'authorization',
    'content-type',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
    'Pragma',
)

Django Debug Toolbar

Django Debug Toolbar 提供了一个测试用的强大调试栏,可在浏览器中直接查看相应的配置、Http Header,SQL,日志等等,非常实用,开发调试必用。

pip install django-debug-toolbar

使用也非常简单。

需要配置 installed_app,静态资源路径和 Middlewares

最后添加路由,判断 Debug 为 True 时启用。

然后我们访问 API 或者视图时会在侧边增加一个调试栏。

Django Environ

对于线上服务来说,多环境不同配置是必不可少的,这就需要 Django Environ 来出马了。Django Environ 可方便地将环境变量合并到 Django settings 配置中。

pip install django-environ

我们一般在 setting.py 中这么写

然后在需要动态配置的设置上获取值。

我们可以通过环境变量或者环境变量文件(唯一直接读取环境变量 ENV_FILE)来载入配置。

.env 文件类似这样(on/off 会被自动转换为布尔值)

DEBUG=on
CORS=on
LOG_LEVEL=INFO
LOG_FILE=app.log

同时可以直接转换数据库和缓存等配置为一个环境变量。

settings.py 中这样配置

然后环境变量或 .env 文件中这样写

DATABASE_URL=psql://postgres:123456@127.0.0.1:5432/postgres
CACHE_URL=rediscache://127.0.0.1:6379/1

这比直接用 os.environ.get 载入环境变量好在哪里呢?

  • 提供了环境变量文件载入,如果是本地调试,把所有变量写入文件当然是最方便的了。
  • 提供了统一的写环境变量初始值的地方(初始化的地方),同时可以指定变量数据类型。
  • 支持数据类型转换,因为环境变量值都是字符串,变量类型转换帮助我们方便地处理转换问题。
  • 支持多行环境变量。
  • 数据库、Redis 等支持一个 URL 环境变量值,不需要一堆环境变量了。
  • 支持环境变量引用。

Django-Redis

Django 中使用缓存很常见,又简单又好用的就是 redis 了。Django redis 库可以直接配置 redis 作为 Django 的缓存或 Session 后端,非常简单。

pip install django-redis

settings.py 中配置

结合上面的 django-environ 就更简单了,我一般都是结合使用,只需要一行配置代码,一个环境变量。

CACHES = {
    'default': env.cache(),
}

环境变量

CACHE_URL=rediscache://127.0.0.1:6379/1

作为 Session 后端使用

SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

django-rest-framework-simplejwt

Django Rest Framework 默认的鉴权方式是基于 Django 的(例如 Session 或者 Token),如果需要 JWT 的方式,现成的轮子也有。

pip install djangorestframework-simplejwt

修改 Rest Framekwork 的鉴权配置

然后添加 Token 的获取和刷新 API

使用如下请求就能获取 token 了

curl \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"username": "admin", "password": "admin"}' \
  http://localhost:8000/api/token/

{
  "access":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiY29sZF9zdHVmZiI6IuKYgyIsImV4cCI6MTIzNDU2LCJqdGkiOiJmZDJmOWQ1ZTFhN2M0MmU4OTQ5MzVlMzYyYmNhOGJjYSJ9.NHlztMGER7UADHZJlxNG0WSi22a2KaYSfd1S-AuT7lU",
  "refresh":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImNvbGRfc3R1ZmYiOiLimIMiLCJleHAiOjIzNDU2NywianRpIjoiZGUxMmY0ZTY3MDY4NDI3ODg5ZjE1YWMyNzcwZGEwNTEifQ.aEoAYkSJjoWH1boshQAaTkf8G3yn0kapko6HFRt7Rh4"
}

临时 token 失效后这样刷新 token

curl \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"refresh":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImNvbGRfc3R1ZmYiOiLimIMiLCJleHAiOjIzNDU2NywianRpIjoiZGUxMmY0ZTY3MDY4NDI3ODg5ZjE1YWMyNzcwZGEwNTEifQ.aEoAYkSJjoWH1boshQAaTkf8G3yn0kapko6HFRt7Rh4"}' \
  http://localhost:8000/api/token/refresh/

{"access":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiY29sZF9zdHVmZiI6IuKYgyIsImV4cCI6MTIzNTY3LCJqdGkiOiJjNzE4ZTVkNjgzZWQ0NTQyYTU0NWJkM2VmMGI0ZGQ0ZSJ9.ekxRxgb9OKmHkfy-zs1Ro_xs1eMLXiR17dIDBVxeT-w"}

在前后端分离的项目上,我们前端使用 axios 的拦截器自动刷新,业务无需关心,代码非常简洁。

Grappelli

Grappelli 是 Django admin 管理界面的皮肤,提供了更友好的使用体验。

pip install django-grappelli

使用也很简单。

配置一下 installed_app

INSTALLED_APPS = (
    'grappelli',
    'django.contrib.admin',
)

添加路由

urlpatterns = [
    path('grappelli/', include('grappelli.urls')), # grappelli URLS
    path('admin/', admin.site.urls), # admin site
]

添加请求上下文处理器

TEMPLATES = [
    {
        ...
        'OPTIONS': {
            'context_processors': [
                ...
                'django.template.context_processors.request',
                ...
            ],
        },
    },
]

然后重新处理一下静态文件就好了。

python manage.py collectstatic

django-celery-results/django-celery-beat

如果你的 Django 服务需要用到 Celery 来做异步任务,那么这两个库还不错,所以写在一起。

django-celery-results 是将 Django 的 ORM 用作 Celery 异步任务的存储结果,在需要将异步任务的结果长期保存及分析时,可以用它来存储到 Django 配置的数据库中。

pip install django-celery-results

简单配置

执行数据库创建

python manage.py migrate django_celery_results

django-celery-beat 是将 Celery 的定时任务配置转移到 Django 的数据库中存储,如果我们业务的管理后台需要定制定时任务,非常好用。

pip install django-celery-beat

简单配置

执行数据库创建

python manage.py migrate

最后在启动 Celery Beat 的时候指定 scheduler

celery -A proj beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler

后记

今天先写这么多了,这些都是这几年 Django 开发积累下来的精选库,如果大家使用中有任何疑问,欢迎评论,找我讨论。如果个别库使用人数多的话,可以再写篇详细使用及避坑指南。如果觉得有用,千万不要吝惜点赞收藏哦!

我是火眼君,愿我的写作,驱散心灵的孤单。

参考