likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 12

前言

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 Web 开发事半功倍

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

1.1 创建 Model 的序列化类 Serializer

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

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

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

1.2 创建视图 View

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

a) 方法视图

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

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

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

b) 类视图

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

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

c) ViewSet 视图

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

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

1.3 绑定路由

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

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

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

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

django-filter

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

pip install django-filter

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

然后可以通过 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 Web 开发事半功倍

同时提供了自定义的配置功能,可直接在 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,日志等等,非常实用,开发调试必用。

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

pip install django-debug-toolbar

使用也非常简单。

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

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

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

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

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

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

Django Environ

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

pip install django-environ

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

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

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

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

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

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

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

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

settings.py 中这样配置

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

然后环境变量或 .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 Web 开发事半功倍

结合上面的 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 的鉴权配置

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

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

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

使用如下请求就能获取 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 管理界面的皮肤,提供了更友好的使用体验。

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

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

简单配置

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

执行数据库创建

python manage.py migrate django_celery_results

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

pip install django-celery-beat

简单配置

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

执行数据库创建

python manage.py migrate

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

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

后记

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

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

参考