流程:API Document
-> 新建分支进行开发 -> models.py
-> views
-> urls.py
-> postman testing on localhost
-> git commit & sync
-> postman testing on cloud server
这一步可以省略,一般在本地通过测试以后,服务器上应该也不会出现问题 -> 通过测试后将新功能分支合并到master
-> 上线部署 -> API Document
- 明确产品需求
- 知道产品的作用、功能
- 可行性分析
- 选择技术栈,优先选择大家都会用的:Django+MySQL
- 关键模块设计方案:
- 用户登录模块,调用TB用户系统接口
- 数据库
- 数据库设计
- MySQL建表时,拆表,允许冗余信息(加快查询速度)
- Redis
- 前后端对接,设计API文档
- 开发
- 日志模块
settings.py
中定义LOGGING
views
中启用logger
:logger = logging.getLogger('django')
- 当程序
raise error
(日志等级为ERROR)时,日志会记录下错误信息(根据settings.py
中的配置) - 给管理员发邮件通知错误信息,需配置
ADMINS
以及一些邮件参数 - 详见:https://note.qidong.name/2018/11/django-logging/
- 后台管理模块
- Django项目规范
models.py
数据库设计- 一般情况不需要更改,更改过多时迁移
migrate
会遇到错误,遇到错误的解决方法见Database
。
- 一般情况不需要更改,更改过多时迁移
/views/xxx.py
API实现:- 大部分的工作会在这里完成。最好是先在API文档中定义好request和response。
- 查django官方文档或者google解决,也可参考之前的代码,POST和GET两种接口的写法几乎是固定的。
urls.py
后端路由:- 将
/views/xxx.py
里面的函数映射到某个url上,一般在完成views
后修改。 - 小心两个url发生冲突。例如:
api/handbook/<str:category>/<int:order>/
与api/handbook/category/<str:category>/
会发生冲突
- 将
- 注意API文档要与
views
,urls.py
同步更新。 - 需要保密的信息写在
local_settings.py
中,其余写在settings.py
中。如数据库配置、邮箱账号密码、SECRET_KEY
需要保密。 views.py
拆分成多个文件views
文件夹相当于一个python包,在urls.py
中,通过from qa.views import *
来导入。在指定某个方法时,需要加上该方法所在的.py
文件的名字,如原先的get_user_info
需要改为user.get_user_info
。/views/__init__.py
中__all__ = ["core", "user", "qa", "handbook", "search", "others"]
指定允许被导入的包。views/
下按照具体业务or数据库模型归类,如views/user.py
是所有关于与user
用户相关的接口,views/qa.py
是所有与问答相关的接口。这样会使代码逻辑更清晰,更容易维护。
- 用户反馈模块
- 日志模块
- 测试
- 在未使用单元测试前:
- postman进行接口测试,自己想边界情况,保证接口正常运作
- 测试数据库与生产数据库分离,如
activity_test
是测试数据库,activity
是生产数据库
- 压力测试
- GoReplay https://github.com/buger/goreplay
- 单元测试
- 在未使用单元测试前:
- 部署
- 服务器
- 连接服务器
- ssh
- VsCode Remote-SSH
$ python manage.py runserver <port>
可以开一个终端窗口一直运行这条命令,每次更改代码后django都会自动重启,无需每次手动重启django。- 服务器上使用
screen
命令来保存终端信息:查看运行中的窗口screen -ls
, 切换到窗口screen -x <id>
(不会将他人踢下线) - 安装python包:可以一个个安装,也可以在开发服务器上用
pip freeze > requirements.txt
,然后将里面的内容复制到生产服务器上,用pip install -r requirements.txt
来批量安装。 - 查看
local_settings.py
,更改数据库设置(如果需要),ALLOW_HOSTS
应该也要改下域名。 - 数据库迁移:
python manage.py makemigrations <app_name>
python manage.py migrate
- 迁移前视情况对数据库进行清空,请事先备份。
python manage.py collectstatic
生成静态文件。- 更改
Nginx
配置文件nginx.conf
,设置静态文件路径。
- 连接服务器
Django
部署清单:- https://docs.djangoproject.com/zh-hans/3.1/howto/deployment/checklist/
python manage.py check --deploy
- 自动部署:GitHub Actions
- 服务器
- 分支管理:每次需要加入/修改某个功能时,从
master
新建一个分支,名字就是该待办事项的名称,完成后将其合并到master
中并删除该分支。如:前端传给后端的label字段是列表,需要转成字符串再保存到数据库
这个需求,就可以建立一个分支叫label列表转字符串
,切换到该分支并完成开发后,将其合并到master
中,经测试后无问题即可删除该分支。 - commit信息要写完整,写详细,解决了某某需求,修复了某某bug,中英文皆可(可中英文结合),如:
API: 修改get_suggested_questions接口,按照问题下的回答的点赞总数从大到小排序
。 - 单次commit内容尽量不要太少,最好是实现了一个需求,或是解决了一个bug。
- 除了紧急修复运行中的bug,其他情况不要直接在服务器上面改代码,后端容易崩。
- Tag用于标记版本,如v1.0是第一个发布的稳定版本,v1.1增加了某某特性
- ⚠尽量不要直接操作数据库,而是通过已经写好的API来操作。
- tips:下载
MySQL Workbench
来可视化管理数据库,进行敏感操作(更改/删除)时要小心。 local_settings.py
中设置数据库python manage.py makemigrations <app_name>
python manage.py migrate <app_name>
migrate
迁移过程中发生错误怎么办?- 首先查看错误信息,常见的有:将某个字段改为
unique
时,由于该字段已经存在重复的数据,不满足unique constraint
,数据库会报错。 - 有些错误可以通过django的引导来更改,比如提供一个
default
值。 - 而像上面所提到的错误则需要手动更改重复的数据,使该列满足
unique constraint
。 - 有时候
migrate
进行了一部分,剩下另一部分由于出错而没有进行,或已经直接对数据库进行了相应更改。此时可以找到对应的迁移文件/migrations/xxxx_auto_yyyy.py
,手动将已经迁移的部分删除,再进行migrate
。为了避免下次migrate
因migrate
不完整而出错,我的解决方法是:migrate
全部完成后,将对应的迁移文件/migrations/xxxx_auto_yyyy.py
删除,再python manage.py makemigrations qa
重新生成完整的迁移文件,然后通过该命令跳过该迁移python manage.py migrate <app_name> xxxx --fake
(xxxx
是当次迁移文件的编号)
- 首先查看错误信息,常见的有:将某个字段改为