这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战
使用Django已经有很长一段时间了,作为一个Python语言开发的非常主流的web框架,Django的功能非常强大,包括路由、ORM、权限、国际化等等。我分享一些多年使用Django的心得。
1. 善用django-admin
django-admin是Django自带的管理后台,我们只要定义完django的model,并且把它配到admin文件里,就能方便地利用admin后台进行管理,自带的web页面方便的实现增删改查等功能。
2. 配合DRF使用
DRF是django-restful-framework,可以实现restful风格的API,让接口风格更加规范,而且可以使得开发过程中更加省代码。DRF是对Django的功能增强,帮助我们写出更加Pythonic的代码。
3. 善于mixin
Python是一个多继承的语言,在阅读一些框架源码时,也会发现很多地方用到了mixin,比如DRF提供的各种viewset。多用组合而不是继承,是一个很好的开发实践。
4. 注意代码分层
新人写Django代码,很容易在view层堆大量的功能逻辑,使得业务代码越来越多,难以维护。比较好的做法是对代码进行分层,借鉴Java的Spring开发的思路。view层可以类比controller,我们还需要service层去处理业务逻辑,dao层去做数据库交互,而不是把所有逻辑都堆在view层。
5. 善用隐藏功能
尽管编程开发中存在二八定律,只要了解一个框架20%的知识点,就能解决80%的问题,但是实际开发中,还是要多翻一翻文档,有些天然支持的功能,没必要自己再重新实现。
6. 不要太依赖ORM
Django一般只适合做单体项目,而且自身的model会依赖外键。如果是大型项目很少会使用外键的。我们在实际开发中,在使用ORM时也不能因为用的很爽,而忽视了底层原理。可以多把ORM的SQL打印出来看看是否可以再优化,要避免N+1问题。
7. 引入celery
celery是一个非常主流的Python语言的分布式调度框架,可以帮我们解决异步任务,定时任务,延迟任务的场景。
8. 注意测试
测试是一个好习惯,Django对测试也有非常完善的支持,平时开发时要多写测试用例。
9. 从单体到微服务
当业务越来越大时,项目很容易演变成大单体,这时候要对其进行拆分。在服务治理领域,有些组件是不依赖语言的,例如consule注册中心,nacos配置中心,gRPC调用等等。
10. 一些最佳实践
- 使用pipenv
- 自定义用户模型
- 基础BaseUserManager和AbstractUser
- 指定AUTH_USER_MODEL
- 优先使用通用类视图
- 函数视图fbv本系列为《Effective Python(第二版)》的读书笔记,第一章,培养Pythonic思维。
- 类视图cbv:django.views.generic import View
- 通用类视图cbgv:DetailView,UpdateView
- ccbv.co.uk
- 一定要编写测试用例
- 单元测试绝不是浪费时间的无用功,它是高质量代码的保障之一
- coverage,测试覆盖度
- 信号量机制