前言
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_app
和 middlewares
就可以了。
同时提供了自定义的配置功能,可直接在 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:[email protected]: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 开发积累下来的精选库,如果大家使用中有任何疑问,欢迎评论,找我讨论。如果个别库使用人数多的话,可以再写篇详细使用及避坑指南。如果觉得有用,千万不要吝惜点赞收藏哦!
来自知乎专栏。
参考
- 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
- https://zhuanlan.zhihu.com/p/105009911