基于 Django 3.2 的 RESTfulAPI 风格的项目模板,用于快速构建高性能的服务端。
- 框架选择:基于 Django 3.2 + django-rest-framework 3.12
- 数据模型:基于 MySQL 存储,使用 mysqlclient 作为驱动,测试也可使用内置 sqlite3
- 授权验证:基于 JWT 鉴权,来自 PyJWT,并做了单点登录的优化。
- 内置功能:自定义命令、代码生成、文件处理、用户系统、异常处理、异步处理、全文检索、动态权限、接口返回格式化、Swagger文档、日志格式化、分页、模糊查询、过滤、排序、动态缓存、分布式锁、国际化等
如需进一步了解,参见 Django 文档。
pip install -r requirements.txt
python manage.py makemigrations
python manage.py migrate
python manage.py loaddata apps/user/user.json
python manage.py ruserver 0.0.0.0:8000
open https://localhost:8000/swagger/
1、使用自定义命令创建 App
python manage.py startmyapp your_app_name
2、将 App 加入到 Settings 中
INSTALLED_APPS = [
...
'apps.your_app_name',
...
]
3、编写您的 models、serializers、views、urls
一般来说,您的正常开发流程如下:
- 根据业务编写您的模型文件 models.py
- 根据模型和您的需求编写您的序列化器 serializers.py
- 根据模型、序列化器、权限来编写您的视图文件 views.py
- 根据视图文件编写您的路由文件 urls.py
- 最后将您的路由添加到入口路由文件中,默认它位于 ./drfAPI/urls.py
4、本项目提供了对于 CRUD 代码的自动生成命令
首先需要创建好需要的模型文件
然后将需要生成的信息更新到生成代码的json文件中,它需要遵循以下的逻辑,它的位置在./configs/generateCode.json
注意:json 文件中的 key 是不能更改的
[
{
"app_name": "public", # 标明你要生成代码的AppName
"models": [ # 标明你要生成代码的模型
{
"model_name": "ConfDict", # 具体的模型类名
"verbose": "系统字典", # 模型的中文标识
"searchs": [ # 标明这个模型生成的代码需要的搜索字段,如果不需要可以删除
"dict_key",
"dict_value"
],
"filters": [ # 标明这个模型生成的代码需要的过滤字段,如果不需要可以删除
"dict_type"
]
}
]
}
]
执行生成代码的命令
python manage.py generatecode
然后查看你的 App,再进行自定义的微调。
当前模版使用英文作为默认语言 在 settings 中已经做了中英文适配,要实现 i18n 的流程如下
1、修改 settings 配置文件
...
from django.utils.translation import gettext_lazy as _
...
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware', # 国际化中间件
...
]
...
LOCALE_PATHS = [
Path.joinpath(Path.joinpath(BASE_DIR, 'i18n'), 'locale')
]
LANGUAGES = [
('en', _('English')),
('zh-hans', _('Simplified Chinese')),
]
LANGUAGE_CODE = 'en' # 默认使用英文
...
2、标记需要翻译的文本 注意的是你在返回 json 时需要翻译的文本,需要先进行标记,例如:
from django.utils.translation import gettext_lazy
class TestView(APIView):
authentication_classes = (JwtAuthentication, )
permission_classes = (AllowAny, )
throttle_classes = (VisitThrottle, )
def get(self, request):
# 使用 gettext_lazy 标记需要翻译的文本
res = MyJsonResponse(res_data={'msg': gettext_lazy('test success')})
return res.data
3、使用命令生成消息文件
在项目根目录执行命令
如果你在根目录使用了虚拟环境,需要使用 -i 指定你的虚拟环境目录,用去忽略该目录。如果不这么做可能会发生问题
-l en 表示生成英文的翻译文件
-l zh_hans 表示生成中文的翻译文件
python manage.py makemessages -l zh_hans -i venv
如果看到输出 processing locale zh_hans 表明消息文件生成好了
并且可以看到设置 LOCALE_PATHS 目录内会生成好指定的 django.po 文件,内容如下
...
#: apps/public/views.py:101
msgid "test success"
msgstr ""
#: drfAPI/settings.py:144
msgid "English"
msgstr ""
#: drfAPI/settings.py:145
msgid "Simplified Chinese"
msgstr ""
...
这个文件需要手动修改 msgstr 为对应的中文翻译,如下示
...
#: apps/public/views.py:101
msgid "test success"
msgstr "测试成功"
#: drfAPI/settings.py:144
msgid "English"
msgstr "英语"
#: drfAPI/settings.py:145
msgid "Simplified Chinese"
msgstr "简体中文"
...
4、生成二进制 .mo 文件
在项目根目录执行命令
python manage.py compilemessages -i venv
如果看到输出 processing file django.po in 你的项目目录/django-RESTfulAPI/i18n/locale/zh_hans/LC_MESSAGES 表明二进制文件生成好了
bash server.sh start # 获取帮助:bash sever.sh help 默认启动端口为 8001