前言
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 的测试界面。
1 | 复制代码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。
1 | 复制代码pip install django-filter |
然后可以通过 URL 参数进行筛选。
1 | 复制代码http://example.com/api/users/1/?name=huoyan&age=20 |
Django CORS Headers
对于前后端分离的架构,后端 API 需要添加 CORS 相应头以提供跨域访问功能。可以自行在相应的每个 Header 中添加,当然现成的轮子有了,何乐而不为?
1 | 复制代码pip install django-cors-headers |
使用非常简单,只要添加 installed_app
和 middlewares
就可以了。
同时提供了自定义的配置功能,可直接在 Django 的 settings 里配置。
1 | 复制代码CORS_ALLOW_CREDENTIALS = True |
Django Debug Toolbar
Django Debug Toolbar 提供了一个测试用的强大调试栏,可在浏览器中直接查看相应的配置、Http Header,SQL,日志等等,非常实用,开发调试必用。
1 | 复制代码pip install django-debug-toolbar |
使用也非常简单。
需要配置 installed_app
,静态资源路径和 Middlewares
。
最后添加路由,判断 Debug 为 True 时启用。
然后我们访问 API 或者视图时会在侧边增加一个调试栏。
Django Environ
对于线上服务来说,多环境不同配置是必不可少的,这就需要 Django Environ 来出马了。Django Environ 可方便地将环境变量合并到 Django settings 配置中。
1 | 复制代码pip install django-environ |
我们一般在 setting.py 中这么写
然后在需要动态配置的设置上获取值。
我们可以通过环境变量或者环境变量文件(唯一直接读取环境变量 ENV_FILE)来载入配置。
.env 文件类似这样(on/off 会被自动转换为布尔值)
1 | 复制代码DEBUG=on |
同时可以直接转换数据库和缓存等配置为一个环境变量。
settings.py
中这样配置
然后环境变量或 .env 文件中这样写
1 | 复制代码DATABASE_URL=psql://postgres:123456@127.0.0.1:5432/postgres |
这比直接用
os.environ.get
载入环境变量好在哪里呢?
- 提供了环境变量文件载入,如果是本地调试,把所有变量写入文件当然是最方便的了。
- 提供了统一的写环境变量初始值的地方(初始化的地方),同时可以指定变量数据类型。
- 支持数据类型转换,因为环境变量值都是字符串,变量类型转换帮助我们方便地处理转换问题。
- 支持多行环境变量。
- 数据库、Redis 等支持一个 URL 环境变量值,不需要一堆环境变量了。
- 支持环境变量引用。
Django-Redis
Django 中使用缓存很常见,又简单又好用的就是 redis 了。Django redis 库可以直接配置 redis 作为 Django 的缓存或 Session 后端,非常简单。
1 | 复制代码pip install django-redis |
settings.py 中配置
结合上面的 django-environ 就更简单了,我一般都是结合使用,只需要一行配置代码,一个环境变量。
1 | 复制代码CACHES = { |
环境变量
1 | 复制代码CACHE_URL=rediscache://127.0.0.1:6379/1 |
作为 Session 后端使用
1 | 复制代码SESSION_ENGINE = "django.contrib.sessions.backends.cache" |
django-rest-framework-simplejwt
Django Rest Framework 默认的鉴权方式是基于 Django 的(例如 Session 或者 Token),如果需要 JWT 的方式,现成的轮子也有。
1 | 复制代码pip install djangorestframework-simplejwt |
修改 Rest Framekwork 的鉴权配置
然后添加 Token 的获取和刷新 API
使用如下请求就能获取 token 了
1 | 复制代码curl \ |
临时 token 失效后这样刷新 token
1 | 复制代码curl \ |
在前后端分离的项目上,我们前端使用 axios 的拦截器自动刷新,业务无需关心,代码非常简洁。
Grappelli
Grappelli 是 Django admin 管理界面的皮肤,提供了更友好的使用体验。
1 | 复制代码pip install django-grappelli |
使用也很简单。
配置一下 installed_app
1 | 复制代码INSTALLED_APPS = ( |
添加路由
1 | 复制代码urlpatterns = [ |
添加请求上下文处理器
1 | 复制代码TEMPLATES = [ |
然后重新处理一下静态文件就好了。
1 | 复制代码python manage.py collectstatic |
django-celery-results/django-celery-beat
如果你的 Django 服务需要用到 Celery 来做异步任务,那么这两个库还不错,所以写在一起。
django-celery-results
是将 Django 的 ORM 用作 Celery 异步任务的存储结果,在需要将异步任务的结果长期保存及分析时,可以用它来存储到 Django 配置的数据库中。
1 | 复制代码pip install django-celery-results |
简单配置
执行数据库创建
1 | 复制代码python manage.py migrate django_celery_results |
而 django-celery-beat
是将 Celery 的定时任务配置转移到 Django 的数据库中存储,如果我们业务的管理后台需要定制定时任务,非常好用。
1 | 复制代码pip install django-celery-beat |
简单配置
执行数据库创建
1 | 复制代码python manage.py migrate |
最后在启动 Celery Beat 的时候指定 scheduler
1 | 复制代码celery -A proj beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler |
后记
今天先写这么多了,这些都是这几年 Django 开发积累下来的精选库,如果大家使用中有任何疑问,欢迎评论,找我讨论。如果个别库使用人数多的话,可以再写篇详细使用及避坑指南。如果觉得有用,千万不要吝惜点赞收藏哦!
我是火眼君,愿我的写作,驱散心灵的孤单。
参考
- Django
- Django Rest Framework
- django-filter
- Django CORS Headers
- Django Debug Toolbar
- Django Environ
- Django-Redis
- django-rest-framework-simplejwt
- Grappelli
- django-celery-results
- django-celery-beat
- zhuanlan.zhihu.com/p/105009911
本文转载自: 掘金