Skip to the content.

Django Starter 基础框架 v3

DjangoStarter v3 是下一代 Django 项目快速开发模板,专为提升开发效率和性能而设计。

结合了 Django 的丰富功能和 Django-Ninja 的性能、灵活、简洁特性,v3 版本旨在为开发者提供一个更加强大、简洁和高速的开发体验。

通过这个全新的框架版本,开发者能够迅速搭建起符合现代 web 应用标准的项目基础架构。

更多新版本的细节,可以查看这篇博客: 关于正在开发中的DjangoStarter v3版本

历史版本

核心特性

适用场景

DjangoStarter v3 是为那些追求高效开发流程、重视应用性能与安全性的 Django 开发者设计的。无论是构建复杂的企业级应用、快速开发 MVP 还是学习最佳实践,DjangoStarter v3 都是一个优秀的选择。

features

v3版本介绍

v2版本已经定下了大体的框架,v3的主要改动是将 RestFramework 换成了 django-ninja ,在 Django 里实现了 FastApi 风格的接口。

其他的功能目前大概是这些:

功能持续更新中,我会同步发在博客,欢迎关注。

文件结构

 DjangoStarter
 ├─ media # 用户上传的文件
 ├─ src # 主要源码
   ├─ apps # 所有应用
     ├─ account # 用户相关的代码,包括登录接口
     ├─ demo # 示例应用
     └─ __init__.py
   ├─ config # Django项目配置
     ├─ settings # 拆分的settings模块
     ├─ __init__.py
     ├─ apis.py # ninja API 配置
     ├─ asgi.py
     ├─ env_init.py # 环境初始化
     ├─ urls.py # 路由配置文件
     ├─ urls_root.py # DjangoStarter的顶层路由配置,用于实现地址前缀配置
     └─ wsgi.py
   ├─ django_starter # 框架代码
     ├─ contrib # 封装好的组件
     ├─ db # 数据库功能(比如 Model 基类)
     ├─ http # 接口相关(如 API 接口返回值包装)
     ├─ middleware # 中间件(IP限制、错误处理等功能)
     ├─ __init__.py
     ├─ apis.py
     ├─ constants.py
     ├─ urls.py
     └─ utilities.py
   ├─ static # 静态文件
     ├─ admin
     └─ css
   ├─ templates # Django模板
     ├─ demo
     └─ _base.html
   ├─ Dockerfile
   ├─ docker-compose.yml
   ├─ manage.py
   ├─ test.py
   └─ uwsgi.ini
 ├─ static-dist # 运行collectstatic命令后把所有静态文件都保存到这个文件夹
 ├─ .gitignore
 ├─ LICENSE
 ├─ README.md
 ├─ clean_pycache.py # 运行后可以清理 __pycache__ 文件
 ├─ gulpfile.js
 ├─ package.json
 ├─ pdm.lock
 ├─ pnpm-lock.yaml
 ├─ pyproject.toml
 └─ tailwind.config.js

快速开始

v3 版本开始我使用了 pdm 作为包管理器,这是一个现代化的包管理和项目管理工具,它专为 Python 项目设计,提供了诸如依赖解析、包安装以及虚拟环境管理等功能。参考:在python项目的docker镜像里使用pdm管理依赖

首先需要安装 pdm ,请参考官网的推荐安装方式进行安装,如果实在是懒得看官网可以按照本文档是懒人版方式安装。

关于 pdm 的一些扩展文档: ./docs/pdm-usage.md

虚拟环境

推荐使用 conda 来管理 python 环境。

首先创建一个虚拟环境

conda create -n django-starter python=3.11

启用虚拟环境

conda activate django-starter

如果没有使用其他方式安装 pdm,可以使用 pip 安装 pdm 包管理器。

pip install pdm

安装依赖

Python 依赖

安装Python依赖:

pdm install

前端资源

前端资源管理参考这篇博客:使用NPM和gulp管理前端静态文件

需要先安装 nodejs 环境,推荐使用 nvm 来管理 node 环境。

安装前端依赖:

yarn install
# 或者使用 pnpm
pnpm i

打包前端资源:

gulp move

如果没有gulp请先安装:npm install --global gulp-cli

如果想使用 tailwindcss ,可以运行。

npx tailwindcss -i ./src/static/css/tailwind.src.css -o ./src/static/css/tailwind.css --watch

关于tailwindcss,详见这篇文章: 在 DjangoStarter 中集成 TailwindCSS

数据库迁移

这个操作会生成一个 db.sqlite3 文件,本地测试推荐使用 SQLite 数据库。

python manage.py migrate

配置缓存(可选)

本项目的限流、安全限制等功能依赖Redis、Memcache等缓存服务,这里以Redis为例。

先在本机安装 Redis 服务并启动。

如果要自定义 Redis 服务器,可以编辑 src/config/settings/components/caches.py 文件,修改以下配置。

'LOCATION': [
    'redis://redis:6379/0' if is_docker else 'redis://localhost:6379/0',
]

支持一主多从,默认是单Redis,会自动根据是否docker环境来切换服务器,请根据实际情况自行配置。

更多配置请参考Django文档: https://docs.djangoproject.com/en/4.1/topics/cache/

配置URL前缀(可选)

在环境变量中指定URL_PREFIX地址前缀

部署应用需要在docker-compose.yml文件中修改这个环境变量

运行应用后,会自动在所有URL前加上前缀,如管理后台的地址

添加URL前缀之前:

http://127.0.0.1/admin

添加URL前缀(如 test)之后:

http://127.0.0.1/test/admin

开始写业务逻辑

使用django-admin命令创建app:

cd apps
django-admin startapp [your_app_name]

仿照src/apps/demo里的逻辑进行业务开发,每个App需要完成以下代码开发:

建议使用 DjangoStarter 代码生成器来生成这些重复的业务代码(见下节)

之后在src/config/apis.py中注册 Ninja 路由。

需要在Django后台进行管理的话,在admin.py中进行注册,参考src/apps/demo/admin.py

随机种子数据生成(可选)

DjangoStarter 内置种子数据生成功能(基于faker库),可以在开发环境下快速在数据库中填充随机假数据,方便测试。

使用以下命令即可自动生成

python manage.py seed app_label 10

其中 app_label 是开发者自行创建的 App 名称,比如 DjangoStarter 中的示例应用 demo

使用代码生成器(可选)

DjangoStarter 内置业务代码生成器,开发者只需要专注于编写最核心的 models.py 完成模型定义,其他代码自动生成,减少重复劳动,解放生产力。

设计模型

首先完成 models.py 里的模型设计,编写规范可以参照 src/apps/demo/models.py

下面是一个简单的模型设计例子:

from django.db import models


class Author(models.Model):
    name = models.CharField('作者名称', max_length=20)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = '作者'
        verbose_name_plural = verbose_name


class Article(models.Model):
    name = models.CharField('文章名称', max_length=20)
    content = models.TextField('文章内容')
    author = models.ForeignKey('Author', verbose_name='文章作者', on_delete=models.CASCADE)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = '文章'
        verbose_name_plural = verbose_name

模型设计的基本要求

注册应用

设计好了Model,需要把其App添加到INSTALLED_APPS才能被扫描到。

编辑config/settings.py文件,在INSTALLED_APPS节点添加应用,里面有注释,一看就懂。

运行代码自动生成

运行命令:

python manage.py autocode [app_label] [verbose_name]

参数说明:

注意:运行自动代码生成会覆盖已有的业务代码!

自动代码生成会创建(覆盖)以下文件:

添加路由

代码生成器会生成你需要的所有代码,之后在src/config/apis.py文件中添加路由:

# 根据你的 App 名称和路径,引入 router
from apps.demo.apis import router as demo_router

# 添加到 ninja 的路由配置里
api.add_router('demo', demo_router)

打开欢迎页面

根据配置不同,项目实际运行的端口可能有所不同,以实际情况为准。

这里假设使用 Django 默认端口 8000,启动项目之后打开 http://localhost:8000 即可看到欢迎页面,即表示 DjangoStarter 项目搭建完成~

访问接口文档

本项目使用 django-ninja 实现 API 接口,其提供了 OpenAPI 的集成功能。

启动项目之后访问 http://localhost:8000/api/doc 即可查看和进行接口测试

配置

与 DjangoStarter 框架有关的配置均在 src/config/settings/components/django_starter.py 文件,里面有详细的注释,一看便懂。

配置网站名称

编辑src/config/settings/components/django_starter.py文件,修改以下代码:

project_info = ProjectInfo('DjangoStarter', '网站说明')

PS: 本项目的后台界面基于SimpleUI,更多Django后台配置方法请参考SimpleUI官方文档。

配置App在后台显示的名称

编辑每个App目录下的apps.py文件,在[AppName]Config类里配置verbose_name,然后在App目录下的__init__.py中,设置default_app_config 即可,具体参照apps/demo的代码。

中间件

配置启用admin后台安全限制中间件

编辑django_starter/middleware/admin_secure.py文件,在AdminSecureMiddleware类可修改以下两个字段进行配置:

编辑config/settings.py文件,在MIDDLEWARE节点中添加django_starter.middleware.admin_secure.AdminSecureMiddleware即可启用安全限制中间件。

配置启用非debug模式下管理员可以查看报错信息

编辑config/settings.py文件,在MIDDLEWARE节点中添加django_starter.middleware/user_base_exception.UserBasedExceptionMiddleware即可。

部署

推荐使用 docker 部署,本项目已经有完善的 docker 部署方案,开箱即用。

生产环境使用基于 ASGI 异步接口的 daphne 作为应用服务器,不再使用同步的 uWSGI 的服务器了。

首先配置 docker 的环境变量,复制一下根目录下的 .env.example 文件

cp .env.example .env

根据需要修改其中的应用端口、容器名称和镜像名称(修改为实际项目名称就行)

然后使用 docker-compose 启动

docker compose up --build

完成之后可以在 .env 中指定的端口进行访问,默认端口是 9876

内置有 nginx 服务器,可以提供 HTTP 服务,如需 HTTPS ,请自行搭配 swag、ACME.sh 之类的方案使用,可以看我博客的介绍。

参考博客文章:新版的Django Docker部署方案,多阶段构建、自动处理前端依赖

TODO

相关博文

公众号 公众号

公众号专辑:Django开发精选

知乎专栏:程序设计实验室

StarBlog博客主页: blog.deali.cn

Django博客合集: https://www.cnblogs.com/deali/category/1799362.html

LICENSE

Apache License Version 2.0, January 2004
http://www.apache.org/licenses/

免责声明

本项目(DjangoStarter)为 DealiAxy 版权所有。本项目代码按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途的适用性和不侵权的保证。在任何情况下,作者或版权持有者均不对因本软件或本软件的使用或其他交易而引起的或与之相关的任何索赔、损害或其他责任负责,无论是合同、侵权还是其他行为。软件。