first commit
This commit is contained in:
19
.flake8
Normal file
19
.flake8
Normal file
@@ -0,0 +1,19 @@
|
||||
[flake8]
|
||||
# flake8配置文件
|
||||
max-line-length = 100
|
||||
exclude =
|
||||
.git,
|
||||
__pycache__,
|
||||
.venv,
|
||||
venv,
|
||||
migrations,
|
||||
build,
|
||||
dist,
|
||||
*.egg-info
|
||||
ignore =
|
||||
E203, # whitespace before ':'
|
||||
E501, # line too long (handled by black)
|
||||
W503, # line break before binary operator
|
||||
per-file-ignores =
|
||||
__init__.py:F401 # 允许未使用的导入
|
||||
|
||||
70
.gitignore
vendored
Normal file
70
.gitignore
vendored
Normal file
@@ -0,0 +1,70 @@
|
||||
# Python 虚拟环境
|
||||
.venv/
|
||||
venv/
|
||||
env/
|
||||
ENV/
|
||||
myenv/
|
||||
*.pyc
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# 环境变量文件
|
||||
.env
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# 数据库文件
|
||||
*.db
|
||||
*.sqlite
|
||||
*.sqlite3
|
||||
instance/
|
||||
|
||||
# 日志文件
|
||||
logs/
|
||||
*.log
|
||||
|
||||
# 上传文件
|
||||
uploads/
|
||||
media/
|
||||
|
||||
# IDE配置
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
.cursor/
|
||||
|
||||
# 操作系统文件
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
desktop.ini
|
||||
|
||||
# 测试覆盖率
|
||||
.coverage
|
||||
htmlcov/
|
||||
.pytest_cache/
|
||||
.tox/
|
||||
|
||||
# 构建文件
|
||||
build/
|
||||
dist/
|
||||
*.egg-info/
|
||||
|
||||
# 迁移文件(可选,建议提交)
|
||||
# migrations/
|
||||
|
||||
# 临时文件
|
||||
*.tmp
|
||||
*.bak
|
||||
*.swp
|
||||
|
||||
# 备份文件
|
||||
backups/
|
||||
*.backup
|
||||
|
||||
# 配置文件(包含敏感信息)
|
||||
config.local.py
|
||||
settings.local.py
|
||||
|
||||
154
PROJECT_STRUCTURE.md
Normal file
154
PROJECT_STRUCTURE.md
Normal file
@@ -0,0 +1,154 @@
|
||||
# 项目结构说明
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
template/
|
||||
├── src/ # 源代码目录
|
||||
│ └── your_app/ # 主应用包(需要重命名为你的应用名)
|
||||
│ ├── __init__.py # 应用工厂,创建Flask应用实例
|
||||
│ ├── app.py # 应用入口(可选,可直接运行)
|
||||
│ ├── models/ # 数据模型
|
||||
│ │ ├── __init__.py # 导出db实例和所有模型
|
||||
│ │ └── example.py # 示例模型
|
||||
│ ├── routes/ # 路由定义
|
||||
│ │ ├── __init__.py # 主路由蓝图
|
||||
│ │ └── *.py # 其他路由模块
|
||||
│ ├── services/ # 业务逻辑层
|
||||
│ │ └── __init__.py # 服务模块初始化
|
||||
│ ├── utils/ # 工具函数
|
||||
│ │ ├── __init__.py # 工具模块初始化
|
||||
│ │ └── helpers.py # 辅助函数
|
||||
│ ├── forms/ # 表单定义(可选,如果使用WTForms)
|
||||
│ │ └── __init__.py
|
||||
│ ├── static/ # 静态资源(CSS、JS、图片等)
|
||||
│ │ ├── css/
|
||||
│ │ ├── js/
|
||||
│ │ └── images/
|
||||
│ └── templates/ # Jinja2模板文件
|
||||
│ ├── base.html # 基础模板
|
||||
│ └── *.html # 其他模板
|
||||
│
|
||||
├── config/ # 配置管理
|
||||
│ ├── __init__.py # 配置选择器,根据环境变量选择配置
|
||||
│ ├── base.py # 基础配置类,所有环境通用配置
|
||||
│ ├── development.py # 开发环境配置
|
||||
│ ├── production.py # 生产环境配置
|
||||
│ ├── testing.py # 测试环境配置
|
||||
│ └── local.py # 本地环境配置
|
||||
│
|
||||
├── requirements/ # 依赖管理(分类管理)
|
||||
│ ├── base.txt # 基础依赖(项目运行必需)
|
||||
│ ├── development.txt # 开发依赖(开发工具)
|
||||
│ ├── production.txt # 生产依赖(WSGI服务器等)
|
||||
│ └── test.txt # 测试依赖(测试框架)
|
||||
│
|
||||
├── tests/ # 测试目录
|
||||
│ ├── __init__.py
|
||||
│ ├── conftest.py # pytest配置和fixtures
|
||||
│ └── test_*.py # 测试文件
|
||||
│
|
||||
├── migrations/ # 数据库迁移(Flask-Migrate自动生成)
|
||||
│ ├── versions/ # 迁移版本文件
|
||||
│ ├── env.py # 迁移环境配置
|
||||
│ └── alembic.ini # Alembic配置
|
||||
│
|
||||
├── logs/ # 日志目录(自动生成)
|
||||
│ └── app.log # 应用日志
|
||||
│
|
||||
├── uploads/ # 上传文件目录(自动生成)
|
||||
│
|
||||
├── docs/ # 文档目录
|
||||
│ ├── README.md # 文档索引
|
||||
│ ├── api/ # API文档
|
||||
│ │ └── README.md
|
||||
│ ├── development/ # 开发文档
|
||||
│ │ └── README.md
|
||||
│ └── deployment/ # 部署文档
|
||||
│ └── README.md
|
||||
│
|
||||
├── scripts/ # 工具脚本
|
||||
│ └── init_project.py # 项目初始化脚本
|
||||
│
|
||||
├── .gitignore # Git忽略文件
|
||||
├── .flake8 # flake8代码检查配置
|
||||
├── pytest.ini # pytest测试配置
|
||||
├── env.example # 环境变量模板
|
||||
├── gunicorn.conf.py # Gunicorn生产服务器配置
|
||||
├── run_dev.py # 开发环境启动脚本
|
||||
├── run_production.py # 生产环境启动脚本(测试用)
|
||||
├── README.md # 项目说明文档
|
||||
├── QUICK_START.md # 快速开始指南
|
||||
└── PROJECT_STRUCTURE.md # 本文件
|
||||
```
|
||||
|
||||
## 核心文件说明
|
||||
|
||||
### 应用工厂 (`src/your_app/__init__.py`)
|
||||
|
||||
使用工厂模式创建Flask应用,支持:
|
||||
- 多环境配置
|
||||
- 扩展初始化
|
||||
- 蓝图注册
|
||||
- 错误处理
|
||||
|
||||
### 配置管理 (`config/`)
|
||||
|
||||
- **base.py**: 所有环境通用的配置
|
||||
- **development.py**: 开发环境(调试模式开启)
|
||||
- **production.py**: 生产环境(安全配置)
|
||||
- **testing.py**: 测试环境(内存数据库)
|
||||
- **local.py**: 本地环境(可自定义)
|
||||
|
||||
通过 `FLASK_ENV` 环境变量自动选择配置。
|
||||
|
||||
### 依赖管理 (`requirements/`)
|
||||
|
||||
分类管理依赖,便于不同环境安装:
|
||||
- **base.txt**: 核心依赖
|
||||
- **development.txt**: 开发工具
|
||||
- **production.txt**: 生产服务器
|
||||
- **test.txt**: 测试框架
|
||||
|
||||
### 测试 (`tests/`)
|
||||
|
||||
使用pytest框架:
|
||||
- **conftest.py**: 定义测试fixtures
|
||||
- **test_*.py**: 测试用例
|
||||
|
||||
## 使用建议
|
||||
|
||||
### 1. 项目命名
|
||||
|
||||
将 `your_app` 替换为你的实际项目名称:
|
||||
- 目录: `src/your_app` -> `src/my_project`
|
||||
- 导入: `from src.your_app import ...` -> `from src.my_project import ...`
|
||||
|
||||
### 2. 添加新功能
|
||||
|
||||
- **路由**: 在 `routes/` 创建新文件,定义蓝图,在 `__init__.py` 注册
|
||||
- **模型**: 在 `models/` 创建新文件,运行迁移
|
||||
- **服务**: 在 `services/` 创建业务逻辑
|
||||
- **工具**: 在 `utils/` 创建辅助函数
|
||||
|
||||
### 3. 环境配置
|
||||
|
||||
通过 `.env` 文件管理配置,不要提交到Git。
|
||||
|
||||
### 4. 数据库迁移
|
||||
|
||||
始终使用Flask-Migrate管理数据库变更:
|
||||
```bash
|
||||
flask db migrate -m "描述"
|
||||
flask db upgrade
|
||||
```
|
||||
|
||||
## 最佳实践
|
||||
|
||||
1. **代码组织**: 按功能模块组织代码,保持单一职责
|
||||
2. **配置管理**: 所有配置通过环境变量,不要硬编码
|
||||
3. **错误处理**: 统一错误处理,返回标准格式
|
||||
4. **日志记录**: 重要操作记录日志
|
||||
5. **测试覆盖**: 关键功能编写测试
|
||||
6. **文档更新**: 及时更新文档,保持同步
|
||||
|
||||
112
QUICK_START.md
Normal file
112
QUICK_START.md
Normal file
@@ -0,0 +1,112 @@
|
||||
# 快速开始指南
|
||||
|
||||
## 5分钟快速启动
|
||||
|
||||
### 步骤1: 复制模板
|
||||
|
||||
```bash
|
||||
# 复制整个template目录
|
||||
cp -r template my_new_project
|
||||
cd my_new_project
|
||||
```
|
||||
|
||||
### 步骤2: 运行初始化脚本(可选)
|
||||
|
||||
```bash
|
||||
# 运行初始化脚本,自动配置项目
|
||||
python scripts/init_project.py
|
||||
```
|
||||
|
||||
或者手动配置:
|
||||
|
||||
### 步骤3: 创建虚拟环境
|
||||
|
||||
```bash
|
||||
python -m venv .venv
|
||||
|
||||
# Windows
|
||||
.venv\Scripts\activate
|
||||
|
||||
# Linux/Mac
|
||||
source .venv/bin/activate
|
||||
```
|
||||
|
||||
### 步骤4: 安装依赖
|
||||
|
||||
```bash
|
||||
pip install -r requirements/base.txt
|
||||
pip install -r requirements/development.txt
|
||||
```
|
||||
|
||||
### 步骤5: 配置环境变量
|
||||
|
||||
```bash
|
||||
# 复制环境变量模板
|
||||
cp env.example .env
|
||||
|
||||
# 编辑.env文件,至少设置:
|
||||
# SECRET_KEY=你的密钥(可以用: python -c "import secrets; print(secrets.token_hex(32))" 生成)
|
||||
# DATABASE_URL=sqlite:///app.db
|
||||
# FLASK_ENV=development
|
||||
```
|
||||
|
||||
### 步骤6: 初始化数据库
|
||||
|
||||
```bash
|
||||
flask db init
|
||||
flask db migrate -m "Initial migration"
|
||||
flask db upgrade
|
||||
```
|
||||
|
||||
### 步骤7: 运行项目
|
||||
|
||||
```bash
|
||||
python run_dev.py
|
||||
```
|
||||
|
||||
访问 http://localhost:5000 查看应用!
|
||||
|
||||
## 重命名项目
|
||||
|
||||
如果使用初始化脚本,会自动处理。否则手动操作:
|
||||
|
||||
1. 重命名目录: `src/your_app` -> `src/your_project_name`
|
||||
2. 更新以下文件中的导入路径:
|
||||
- `run_dev.py`
|
||||
- `run_production.py`
|
||||
- `gunicorn.conf.py`
|
||||
- `tests/conftest.py`
|
||||
- 所有测试文件
|
||||
|
||||
## 下一步
|
||||
|
||||
- 查看 [README.md](README.md) 了解完整文档
|
||||
- 查看 [docs/](docs/) 目录了解详细文档
|
||||
- 开始编写你的业务代码!
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q: 如何生成SECRET_KEY?
|
||||
|
||||
```bash
|
||||
python -c "import secrets; print(secrets.token_hex(32))"
|
||||
```
|
||||
|
||||
### Q: 如何添加新的路由?
|
||||
|
||||
1. 在 `src/your_app/routes/` 创建新的路由文件
|
||||
2. 在 `src/your_app/__init__.py` 中注册蓝图
|
||||
|
||||
### Q: 如何添加新的模型?
|
||||
|
||||
1. 在 `src/your_app/models/` 创建新的模型文件
|
||||
2. 在 `src/your_app/models/__init__.py` 中导入
|
||||
3. 运行 `flask db migrate -m "描述"` 创建迁移
|
||||
|
||||
### Q: 如何运行测试?
|
||||
|
||||
```bash
|
||||
pip install -r requirements/test.txt
|
||||
pytest
|
||||
```
|
||||
|
||||
258
README.md
Normal file
258
README.md
Normal file
@@ -0,0 +1,258 @@
|
||||
# Python项目模板
|
||||
|
||||
这是一个通用的Python项目模板,基于Flask框架的最佳实践,可以直接复制使用,快速启动新项目。
|
||||
|
||||
## 项目特性
|
||||
|
||||
- ✅ **标准化项目结构** - 清晰的目录组织,易于维护
|
||||
- ✅ **多环境配置管理** - 支持development/production/testing/local环境
|
||||
- ✅ **依赖分类管理** - 基础/开发/生产/测试依赖分离
|
||||
- ✅ **应用工厂模式** - 灵活的Flask应用创建方式
|
||||
- ✅ **数据库迁移支持** - 使用Flask-Migrate管理数据库版本
|
||||
- ✅ **环境变量管理** - 使用.env文件管理敏感配置
|
||||
- ✅ **完整的文档结构** - 包含API、开发、部署文档模板
|
||||
- ✅ **测试框架集成** - pytest测试配置
|
||||
- ✅ **日志系统** - 自动配置日志记录
|
||||
- ✅ **跨域支持** - CORS配置
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 1. 复制模板
|
||||
|
||||
```bash
|
||||
# 复制整个template目录到你的新项目位置
|
||||
cp -r template my_new_project
|
||||
cd my_new_project
|
||||
```
|
||||
|
||||
### 2. 初始化项目
|
||||
|
||||
```bash
|
||||
# 创建虚拟环境
|
||||
python -m venv .venv
|
||||
|
||||
# 激活虚拟环境
|
||||
# Windows
|
||||
.venv\Scripts\activate
|
||||
# Linux/Mac
|
||||
source .venv/bin/activate
|
||||
|
||||
# 安装依赖
|
||||
pip install -r requirements/base.txt
|
||||
pip install -r requirements/development.txt
|
||||
```
|
||||
|
||||
### 3. 配置环境变量
|
||||
|
||||
```bash
|
||||
# 复制环境变量模板
|
||||
cp .env.example .env
|
||||
|
||||
# 编辑.env文件,填入你的配置
|
||||
# 至少需要设置:
|
||||
# - SECRET_KEY
|
||||
# - DATABASE_URL
|
||||
# - FLASK_ENV
|
||||
```
|
||||
|
||||
### 4. 初始化数据库
|
||||
|
||||
```bash
|
||||
# 初始化数据库迁移
|
||||
flask db init
|
||||
|
||||
# 创建初始迁移
|
||||
flask db migrate -m "Initial migration"
|
||||
|
||||
# 应用迁移
|
||||
flask db upgrade
|
||||
```
|
||||
|
||||
### 5. 运行项目
|
||||
|
||||
```bash
|
||||
# 开发模式
|
||||
python run_dev.py
|
||||
|
||||
# 或使用Flask命令
|
||||
flask run
|
||||
```
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
template/
|
||||
├── src/ # 源代码目录
|
||||
│ └── your_app/ # 主应用包(需要重命名)
|
||||
│ ├── __init__.py # 应用工厂
|
||||
│ ├── app.py # 应用配置
|
||||
│ ├── models/ # 数据模型
|
||||
│ ├── routes/ # 路由定义
|
||||
│ ├── services/ # 业务逻辑
|
||||
│ ├── utils/ # 工具函数
|
||||
│ ├── forms/ # 表单定义(可选)
|
||||
│ ├── static/ # 静态资源
|
||||
│ └── templates/ # 模板文件
|
||||
├── config/ # 配置管理
|
||||
│ ├── __init__.py # 配置选择器
|
||||
│ ├── base.py # 基础配置
|
||||
│ ├── development.py # 开发环境
|
||||
│ ├── production.py # 生产环境
|
||||
│ ├── testing.py # 测试环境
|
||||
│ └── local.py # 本地环境
|
||||
├── requirements/ # 依赖管理
|
||||
│ ├── base.txt # 基础依赖
|
||||
│ ├── development.txt # 开发依赖
|
||||
│ ├── production.txt # 生产依赖
|
||||
│ └── test.txt # 测试依赖
|
||||
├── tests/ # 测试目录
|
||||
│ ├── __init__.py
|
||||
│ ├── conftest.py # pytest配置
|
||||
│ └── test_*.py # 测试文件
|
||||
├── migrations/ # 数据库迁移(自动生成)
|
||||
├── logs/ # 日志目录(自动生成)
|
||||
├── uploads/ # 上传文件目录(自动生成)
|
||||
├── docs/ # 文档目录
|
||||
│ ├── api/ # API文档
|
||||
│ ├── development/ # 开发文档
|
||||
│ └── deployment/ # 部署文档
|
||||
├── scripts/ # 工具脚本
|
||||
│ └── init_project.py # 项目初始化脚本
|
||||
├── .env.example # 环境变量模板
|
||||
├── .gitignore # Git忽略文件
|
||||
├── run_dev.py # 开发服务器启动脚本
|
||||
├── run_production.py # 生产环境启动脚本
|
||||
└── README.md # 项目说明(本文件)
|
||||
```
|
||||
|
||||
## 使用说明
|
||||
|
||||
### 重命名项目
|
||||
|
||||
1. 将 `src/your_app/` 目录重命名为你的应用名称
|
||||
2. 更新 `src/your_app/__init__.py` 中的导入路径
|
||||
3. 更新 `run_dev.py` 和 `run_production.py` 中的导入路径
|
||||
4. 更新所有文档中的项目名称
|
||||
|
||||
### 配置环境
|
||||
|
||||
通过设置 `FLASK_ENV` 环境变量来选择配置:
|
||||
|
||||
```bash
|
||||
# 开发环境(默认)
|
||||
export FLASK_ENV=development
|
||||
|
||||
# 生产环境
|
||||
export FLASK_ENV=production
|
||||
|
||||
# 测试环境
|
||||
export FLASK_ENV=testing
|
||||
|
||||
# 本地环境
|
||||
export FLASK_ENV=local
|
||||
```
|
||||
|
||||
### 添加新功能
|
||||
|
||||
1. **添加路由**:在 `src/your_app/routes/` 创建新的路由文件
|
||||
2. **添加模型**:在 `src/your_app/models/` 创建新的模型文件
|
||||
3. **添加服务**:在 `src/your_app/services/` 创建业务逻辑
|
||||
4. **添加工具**:在 `src/your_app/utils/` 创建工具函数
|
||||
|
||||
### 数据库迁移
|
||||
|
||||
```bash
|
||||
# 创建迁移
|
||||
flask db migrate -m "描述信息"
|
||||
|
||||
# 应用迁移
|
||||
flask db upgrade
|
||||
|
||||
# 回滚迁移
|
||||
flask db downgrade
|
||||
```
|
||||
|
||||
### 运行测试
|
||||
|
||||
```bash
|
||||
# 安装测试依赖
|
||||
pip install -r requirements/test.txt
|
||||
|
||||
# 运行所有测试
|
||||
pytest
|
||||
|
||||
# 运行特定测试文件
|
||||
pytest tests/test_example.py
|
||||
|
||||
# 生成覆盖率报告
|
||||
pytest --cov=src tests/
|
||||
```
|
||||
|
||||
## 依赖管理
|
||||
|
||||
依赖按用途分类管理:
|
||||
|
||||
- **base.txt**: 项目运行必需的基础依赖
|
||||
- **development.txt**: 开发工具(调试器、代码检查等)
|
||||
- **production.txt**: 生产环境依赖(WSGI服务器等)
|
||||
- **test.txt**: 测试框架和工具
|
||||
|
||||
安装方式:
|
||||
|
||||
```bash
|
||||
# 开发环境
|
||||
pip install -r requirements/base.txt
|
||||
pip install -r requirements/development.txt
|
||||
|
||||
# 生产环境
|
||||
pip install -r requirements/base.txt
|
||||
pip install -r requirements/production.txt
|
||||
```
|
||||
|
||||
## 环境变量说明
|
||||
|
||||
所有配置通过环境变量管理,详见 `.env.example` 文件。
|
||||
|
||||
**必需的环境变量:**
|
||||
- `SECRET_KEY`: Flask密钥
|
||||
- `DATABASE_URL`: 数据库连接URL
|
||||
- `FLASK_ENV`: 运行环境
|
||||
|
||||
## 部署
|
||||
|
||||
### 开发环境
|
||||
|
||||
```bash
|
||||
python run_dev.py
|
||||
```
|
||||
|
||||
### 生产环境
|
||||
|
||||
```bash
|
||||
# 使用Gunicorn
|
||||
gunicorn -c gunicorn.conf.py "src.your_app:create_app()"
|
||||
|
||||
# 或使用uWSGI
|
||||
uwsgi --ini uwsgi.ini
|
||||
```
|
||||
|
||||
## 贡献指南
|
||||
|
||||
1. Fork本项目
|
||||
2. 创建功能分支
|
||||
3. 提交更改
|
||||
4. 推送到分支
|
||||
5. 创建Pull Request
|
||||
|
||||
## 许可证
|
||||
|
||||
MIT License
|
||||
|
||||
## 更新日志
|
||||
|
||||
### v1.0.0 (2025-01-XX)
|
||||
- 初始版本
|
||||
- 基础项目结构
|
||||
- 多环境配置支持
|
||||
- 依赖分类管理
|
||||
|
||||
128
TEMPLATE_INFO.md
Normal file
128
TEMPLATE_INFO.md
Normal file
@@ -0,0 +1,128 @@
|
||||
# 模板项目信息
|
||||
|
||||
## 模板来源
|
||||
|
||||
本模板基于 `aitsc` 项目的最佳实践抽取而成,保留了以下核心特性:
|
||||
|
||||
- ✅ 标准化的项目结构
|
||||
- ✅ 多环境配置管理
|
||||
- ✅ 依赖分类管理
|
||||
- ✅ 应用工厂模式
|
||||
- ✅ 完整的测试框架
|
||||
- ✅ 文档结构模板
|
||||
|
||||
## 文件清单
|
||||
|
||||
### 配置文件
|
||||
|
||||
- `.gitignore` - Git忽略文件配置
|
||||
- `.flake8` - flake8代码检查配置
|
||||
- `pytest.ini` - pytest测试配置
|
||||
- `env.example` - 环境变量模板
|
||||
- `gunicorn.conf.py` - Gunicorn生产服务器配置
|
||||
|
||||
### 启动脚本
|
||||
|
||||
- `run_dev.py` - 开发环境启动脚本
|
||||
- `run_production.py` - 生产环境启动脚本(测试用)
|
||||
|
||||
### 配置模块 (`config/`)
|
||||
|
||||
- `__init__.py` - 配置选择器
|
||||
- `base.py` - 基础配置类
|
||||
- `development.py` - 开发环境配置
|
||||
- `production.py` - 生产环境配置
|
||||
- `testing.py` - 测试环境配置
|
||||
- `local.py` - 本地环境配置
|
||||
|
||||
### 源代码 (`src/your_app/`)
|
||||
|
||||
- `__init__.py` - 应用工厂
|
||||
- `app.py` - 应用入口
|
||||
- `models/` - 数据模型
|
||||
- `__init__.py`
|
||||
- `example.py` - 示例模型
|
||||
- `routes/` - 路由定义
|
||||
- `__init__.py` - 主路由蓝图
|
||||
- `services/` - 业务逻辑
|
||||
- `__init__.py`
|
||||
- `utils/` - 工具函数
|
||||
- `__init__.py`
|
||||
- `helpers.py` - 辅助函数
|
||||
- `static/` - 静态资源目录
|
||||
- `templates/` - 模板文件
|
||||
- `base.html` - 基础模板
|
||||
- `index.html` - 首页模板
|
||||
|
||||
### 依赖管理 (`requirements/`)
|
||||
|
||||
- `base.txt` - 基础依赖
|
||||
- `development.txt` - 开发依赖
|
||||
- `production.txt` - 生产依赖
|
||||
- `test.txt` - 测试依赖
|
||||
|
||||
### 测试 (`tests/`)
|
||||
|
||||
- `__init__.py`
|
||||
- `conftest.py` - pytest配置和fixtures
|
||||
- `test_example.py` - 示例测试
|
||||
|
||||
### 文档 (`docs/`)
|
||||
|
||||
- `README.md` - 文档索引
|
||||
- `api/README.md` - API文档模板
|
||||
- `development/README.md` - 开发文档模板
|
||||
- `deployment/README.md` - 部署文档模板
|
||||
|
||||
### 工具脚本 (`scripts/`)
|
||||
|
||||
- `init_project.py` - 项目初始化脚本
|
||||
|
||||
### 文档文件
|
||||
|
||||
- `README.md` - 项目说明
|
||||
- `QUICK_START.md` - 快速开始指南
|
||||
- `PROJECT_STRUCTURE.md` - 项目结构说明
|
||||
- `USAGE.md` - 使用说明
|
||||
- `TEMPLATE_INFO.md` - 本文件
|
||||
|
||||
## 使用方式
|
||||
|
||||
### 方式1: 直接复制
|
||||
|
||||
```bash
|
||||
cp -r template my_new_project
|
||||
cd my_new_project
|
||||
# 然后按照README.md的说明配置
|
||||
```
|
||||
|
||||
### 方式2: 使用初始化脚本
|
||||
|
||||
```bash
|
||||
cp -r template my_new_project
|
||||
cd my_new_project
|
||||
python scripts/init_project.py
|
||||
# 脚本会引导你完成初始化
|
||||
```
|
||||
|
||||
## 下一步
|
||||
|
||||
1. 查看 [README.md](README.md) 了解完整功能
|
||||
2. 查看 [QUICK_START.md](QUICK_START.md) 快速开始
|
||||
3. 查看 [USAGE.md](USAGE.md) 了解详细使用方法
|
||||
4. 查看 [PROJECT_STRUCTURE.md](PROJECT_STRUCTURE.md) 了解项目结构
|
||||
|
||||
## 版本信息
|
||||
|
||||
- 模板版本: v1.0.0
|
||||
- 创建日期: 2025-01-XX
|
||||
- 基于项目: aitsc
|
||||
- Python版本要求: 3.8+
|
||||
|
||||
## 贡献
|
||||
|
||||
如果你有改进建议,欢迎:
|
||||
1. 提出Issue
|
||||
2. 提交Pull Request
|
||||
3. 分享使用经验
|
||||
|
||||
290
USAGE.md
Normal file
290
USAGE.md
Normal file
@@ -0,0 +1,290 @@
|
||||
# 模板使用说明
|
||||
|
||||
## 模板特性
|
||||
|
||||
本模板基于aitsc项目的最佳实践,抽取了以下核心特性:
|
||||
|
||||
### ✅ 已实现的功能
|
||||
|
||||
1. **标准化项目结构**
|
||||
- 清晰的目录组织(src/、config/、tests/等)
|
||||
- 模块化设计,易于扩展
|
||||
|
||||
2. **多环境配置管理**
|
||||
- 支持development/production/testing/local四种环境
|
||||
- 通过环境变量自动选择配置
|
||||
- 配置继承机制,减少重复
|
||||
|
||||
3. **依赖分类管理**
|
||||
- base.txt: 核心依赖
|
||||
- development.txt: 开发工具
|
||||
- production.txt: 生产服务器
|
||||
- test.txt: 测试框架
|
||||
|
||||
4. **应用工厂模式**
|
||||
- 灵活的Flask应用创建方式
|
||||
- 支持测试和不同环境
|
||||
|
||||
5. **数据库迁移支持**
|
||||
- 使用Flask-Migrate管理数据库版本
|
||||
- 支持多数据库(SQLite/MySQL/PostgreSQL)
|
||||
|
||||
6. **环境变量管理**
|
||||
- 使用python-dotenv加载.env文件
|
||||
- 提供env.example模板
|
||||
|
||||
7. **完整的测试框架**
|
||||
- pytest配置
|
||||
- 测试fixtures
|
||||
- 示例测试用例
|
||||
|
||||
8. **文档结构**
|
||||
- API文档模板
|
||||
- 开发文档模板
|
||||
- 部署文档模板
|
||||
|
||||
9. **代码质量工具**
|
||||
- flake8配置
|
||||
- pytest配置
|
||||
- 支持代码格式化(Black、isort)
|
||||
|
||||
10. **生产环境支持**
|
||||
- Gunicorn配置
|
||||
- 日志系统
|
||||
- 错误处理
|
||||
|
||||
## 使用流程
|
||||
|
||||
### 1. 复制模板
|
||||
|
||||
```bash
|
||||
cp -r template my_new_project
|
||||
cd my_new_project
|
||||
```
|
||||
|
||||
### 2. 运行初始化(推荐)
|
||||
|
||||
```bash
|
||||
python scripts/init_project.py
|
||||
```
|
||||
|
||||
脚本会自动:
|
||||
- 生成SECRET_KEY
|
||||
- 创建.env文件
|
||||
- 创建必要目录
|
||||
- 可选:重命名应用目录
|
||||
|
||||
### 3. 手动配置(如果未使用脚本)
|
||||
|
||||
```bash
|
||||
# 创建虚拟环境
|
||||
python -m venv .venv
|
||||
source .venv/bin/activate # Linux/Mac
|
||||
# 或 .venv\Scripts\activate # Windows
|
||||
|
||||
# 安装依赖
|
||||
pip install -r requirements/base.txt
|
||||
pip install -r requirements/development.txt
|
||||
|
||||
# 配置环境变量
|
||||
cp env.example .env
|
||||
# 编辑.env文件,至少设置SECRET_KEY和DATABASE_URL
|
||||
```
|
||||
|
||||
### 4. 初始化数据库
|
||||
|
||||
```bash
|
||||
flask db init
|
||||
flask db migrate -m "Initial migration"
|
||||
flask db upgrade
|
||||
```
|
||||
|
||||
### 5. 运行项目
|
||||
|
||||
```bash
|
||||
python run_dev.py
|
||||
```
|
||||
|
||||
## 自定义项目
|
||||
|
||||
### 重命名应用
|
||||
|
||||
1. 重命名目录: `src/your_app` -> `src/my_app`
|
||||
2. 更新导入路径:
|
||||
- `run_dev.py`: `from src.your_app` -> `from src.my_app`
|
||||
- `run_production.py`: 同上
|
||||
- `gunicorn.conf.py`: `"src.your_app:create_app()"` -> `"src.my_app:create_app()"`
|
||||
- `tests/conftest.py`: 同上
|
||||
- 所有测试文件中的导入
|
||||
|
||||
### 添加新功能
|
||||
|
||||
#### 添加路由
|
||||
|
||||
1. 在 `src/your_app/routes/` 创建新文件,例如 `api.py`:
|
||||
|
||||
```python
|
||||
from flask import Blueprint, jsonify
|
||||
|
||||
api_bp = Blueprint('api', __name__, url_prefix='/api/v1')
|
||||
|
||||
@api_bp.route('/users')
|
||||
def get_users():
|
||||
return jsonify({'users': []})
|
||||
```
|
||||
|
||||
2. 在 `src/your_app/__init__.py` 注册:
|
||||
|
||||
```python
|
||||
from src.your_app.routes.api import api_bp
|
||||
app.register_blueprint(api_bp)
|
||||
```
|
||||
|
||||
#### 添加模型
|
||||
|
||||
1. 在 `src/your_app/models/` 创建新文件,例如 `user.py`:
|
||||
|
||||
```python
|
||||
from datetime import datetime
|
||||
from src.your_app import db
|
||||
|
||||
class User(db.Model):
|
||||
__tablename__ = 'users'
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
username = db.Column(db.String(80), unique=True, nullable=False)
|
||||
email = db.Column(db.String(120), unique=True, nullable=False)
|
||||
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
```
|
||||
|
||||
2. 在 `src/your_app/models/__init__.py` 导入:
|
||||
|
||||
```python
|
||||
from .user import User
|
||||
|
||||
__all__ = ['db', 'User']
|
||||
```
|
||||
|
||||
3. 创建迁移:
|
||||
|
||||
```bash
|
||||
flask db migrate -m "Add User model"
|
||||
flask db upgrade
|
||||
```
|
||||
|
||||
#### 添加服务
|
||||
|
||||
在 `src/your_app/services/` 创建业务逻辑:
|
||||
|
||||
```python
|
||||
from src.your_app.models import User, db
|
||||
|
||||
class UserService:
|
||||
@staticmethod
|
||||
def create_user(username, email):
|
||||
user = User(username=username, email=email)
|
||||
db.session.add(user)
|
||||
db.session.commit()
|
||||
return user
|
||||
```
|
||||
|
||||
## 环境配置
|
||||
|
||||
### 开发环境
|
||||
|
||||
```bash
|
||||
export FLASK_ENV=development
|
||||
python run_dev.py
|
||||
```
|
||||
|
||||
- 启用调试模式
|
||||
- 使用开发数据库
|
||||
- 详细错误信息
|
||||
|
||||
### 生产环境
|
||||
|
||||
```bash
|
||||
export FLASK_ENV=production
|
||||
gunicorn -c gunicorn.conf.py "src.your_app:create_app()"
|
||||
```
|
||||
|
||||
- 关闭调试模式
|
||||
- 使用生产数据库
|
||||
- 安全配置
|
||||
|
||||
### 测试环境
|
||||
|
||||
```bash
|
||||
export FLASK_ENV=testing
|
||||
pytest
|
||||
```
|
||||
|
||||
- 使用内存数据库
|
||||
- 关闭CSRF保护
|
||||
- 快速测试
|
||||
|
||||
## 常见任务
|
||||
|
||||
### 运行测试
|
||||
|
||||
```bash
|
||||
pip install -r requirements/test.txt
|
||||
pytest
|
||||
pytest --cov=src tests/ # 带覆盖率
|
||||
```
|
||||
|
||||
### 代码检查
|
||||
|
||||
```bash
|
||||
pip install -r requirements/development.txt
|
||||
flake8 src/
|
||||
pylint src/
|
||||
black src/ # 格式化
|
||||
isort src/ # 排序导入
|
||||
```
|
||||
|
||||
### 数据库操作
|
||||
|
||||
```bash
|
||||
# 创建迁移
|
||||
flask db migrate -m "描述"
|
||||
|
||||
# 应用迁移
|
||||
flask db upgrade
|
||||
|
||||
# 回滚迁移
|
||||
flask db downgrade
|
||||
|
||||
# 查看迁移历史
|
||||
flask db history
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **不要提交敏感信息**
|
||||
- `.env` 文件已加入.gitignore
|
||||
- 不要将密钥、密码等提交到代码库
|
||||
|
||||
2. **环境变量必需项**
|
||||
- `SECRET_KEY`: Flask密钥(必需)
|
||||
- `DATABASE_URL`: 数据库连接(必需)
|
||||
- `FLASK_ENV`: 运行环境(可选,默认development)
|
||||
|
||||
3. **生产环境安全**
|
||||
- 必须设置强SECRET_KEY
|
||||
- 必须使用非SQLite数据库
|
||||
- 必须配置CORS_ORIGINS限制
|
||||
- 必须启用HTTPS
|
||||
|
||||
4. **数据库迁移**
|
||||
- 始终使用Flask-Migrate管理数据库变更
|
||||
- 不要直接修改数据库结构
|
||||
- 迁移文件应该提交到代码库
|
||||
|
||||
## 获取帮助
|
||||
|
||||
- 查看 [README.md](README.md) 了解完整文档
|
||||
- 查看 [QUICK_START.md](QUICK_START.md) 快速开始
|
||||
- 查看 [PROJECT_STRUCTURE.md](PROJECT_STRUCTURE.md) 了解项目结构
|
||||
- 查看 [docs/](docs/) 目录了解详细文档
|
||||
|
||||
43
config/__init__.py
Normal file
43
config/__init__.py
Normal file
@@ -0,0 +1,43 @@
|
||||
"""
|
||||
配置管理模块
|
||||
根据环境变量自动选择对应的配置类
|
||||
"""
|
||||
import os
|
||||
from .base import Config
|
||||
from .development import DevelopmentConfig
|
||||
from .production import ProductionConfig
|
||||
from .testing import TestingConfig
|
||||
from .local import LocalConfig
|
||||
|
||||
# 配置映射字典
|
||||
config_map = {
|
||||
'development': DevelopmentConfig,
|
||||
'production': ProductionConfig,
|
||||
'testing': TestingConfig,
|
||||
'local': LocalConfig,
|
||||
'default': DevelopmentConfig
|
||||
}
|
||||
|
||||
def get_config():
|
||||
"""
|
||||
根据环境变量获取对应的配置类
|
||||
|
||||
环境变量: FLASK_ENV
|
||||
可选值: development, production, testing, local
|
||||
|
||||
Returns:
|
||||
Config类: 对应环境的配置类
|
||||
"""
|
||||
env = os.environ.get('FLASK_ENV', 'development')
|
||||
return config_map.get(env, config_map['default'])
|
||||
|
||||
# 导出配置类
|
||||
__all__ = [
|
||||
'Config',
|
||||
'DevelopmentConfig',
|
||||
'ProductionConfig',
|
||||
'TestingConfig',
|
||||
'LocalConfig',
|
||||
'get_config'
|
||||
]
|
||||
|
||||
82
config/base.py
Normal file
82
config/base.py
Normal file
@@ -0,0 +1,82 @@
|
||||
"""
|
||||
基础配置类
|
||||
包含所有环境通用的配置项
|
||||
"""
|
||||
import os
|
||||
from datetime import timedelta
|
||||
|
||||
class Config:
|
||||
"""
|
||||
基础配置类
|
||||
所有环境配置都继承此类
|
||||
"""
|
||||
|
||||
# Flask基础配置
|
||||
SECRET_KEY = os.environ.get('SECRET_KEY')
|
||||
if not SECRET_KEY:
|
||||
raise ValueError("SECRET_KEY 环境变量未设置,请在.env文件中配置")
|
||||
|
||||
# 数据库配置
|
||||
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'sqlite:///app.db'
|
||||
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
||||
SQLALCHEMY_ENGINE_OPTIONS = {
|
||||
'pool_pre_ping': True, # 连接前检查连接是否有效
|
||||
'pool_recycle': 300, # 连接回收时间(秒)
|
||||
}
|
||||
|
||||
# 跨域配置
|
||||
CORS_ORIGINS = os.environ.get('CORS_ORIGINS', '*').split(',')
|
||||
|
||||
# 日志配置
|
||||
LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO')
|
||||
LOG_FILE = os.environ.get('LOG_FILE', 'logs/app.log')
|
||||
|
||||
# 缓存配置
|
||||
CACHE_TYPE = os.environ.get('CACHE_TYPE', 'simple')
|
||||
CACHE_DEFAULT_TIMEOUT = int(os.environ.get('CACHE_DEFAULT_TIMEOUT', 300))
|
||||
|
||||
# Redis缓存配置(当CACHE_TYPE=redis时使用)
|
||||
REDIS_URL = os.environ.get('REDIS_URL', 'redis://localhost:6379/0')
|
||||
|
||||
# 会话配置
|
||||
PERMANENT_SESSION_LIFETIME = timedelta(
|
||||
hours=int(os.environ.get('SESSION_LIFETIME_HOURS', 24))
|
||||
)
|
||||
|
||||
# 文件上传配置
|
||||
MAX_CONTENT_LENGTH = int(os.environ.get('MAX_CONTENT_LENGTH', 16 * 1024 * 1024)) # 16MB
|
||||
UPLOAD_FOLDER = os.environ.get('UPLOAD_FOLDER', 'uploads')
|
||||
|
||||
# 安全配置
|
||||
WTF_CSRF_ENABLED = os.environ.get('WTF_CSRF_ENABLED', 'True').lower() == 'true'
|
||||
WTF_CSRF_TIME_LIMIT = int(os.environ.get('WTF_CSRF_TIME_LIMIT', 3600))
|
||||
|
||||
@staticmethod
|
||||
def init_app(app):
|
||||
"""
|
||||
初始化应用配置
|
||||
创建必要的目录和配置日志
|
||||
"""
|
||||
# 创建必要的目录
|
||||
os.makedirs('logs', exist_ok=True)
|
||||
os.makedirs('uploads', exist_ok=True)
|
||||
|
||||
# 配置日志
|
||||
import logging
|
||||
from logging.handlers import RotatingFileHandler
|
||||
|
||||
if not app.debug and not app.testing:
|
||||
file_handler = RotatingFileHandler(
|
||||
Config.LOG_FILE,
|
||||
maxBytes=10240000, # 10MB
|
||||
backupCount=10
|
||||
)
|
||||
file_handler.setFormatter(logging.Formatter(
|
||||
'%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
|
||||
))
|
||||
file_handler.setLevel(getattr(logging, Config.LOG_LEVEL))
|
||||
app.logger.addHandler(file_handler)
|
||||
|
||||
app.logger.setLevel(getattr(logging, Config.LOG_LEVEL))
|
||||
app.logger.info('应用启动')
|
||||
|
||||
22
config/development.py
Normal file
22
config/development.py
Normal file
@@ -0,0 +1,22 @@
|
||||
"""
|
||||
开发环境配置
|
||||
"""
|
||||
from .base import Config
|
||||
|
||||
class DevelopmentConfig(Config):
|
||||
"""
|
||||
开发环境配置
|
||||
启用调试模式,使用开发数据库
|
||||
"""
|
||||
DEBUG = True
|
||||
TESTING = False
|
||||
|
||||
# 开发环境可以使用SQLite
|
||||
SQLALCHEMY_DATABASE_URI = Config.SQLALCHEMY_DATABASE_URI or 'sqlite:///dev.db'
|
||||
|
||||
# 开发环境日志级别
|
||||
LOG_LEVEL = 'DEBUG'
|
||||
|
||||
# 开发环境允许所有跨域请求
|
||||
CORS_ORIGINS = ['*']
|
||||
|
||||
15
config/local.py
Normal file
15
config/local.py
Normal file
@@ -0,0 +1,15 @@
|
||||
"""
|
||||
本地环境配置
|
||||
用于本地开发,可以覆盖默认配置
|
||||
"""
|
||||
from .development import DevelopmentConfig
|
||||
|
||||
class LocalConfig(DevelopmentConfig):
|
||||
"""
|
||||
本地环境配置
|
||||
继承开发环境配置,可以添加本地特定配置
|
||||
"""
|
||||
# 本地环境可以使用本地数据库
|
||||
# 可以在这里覆盖开发环境的配置
|
||||
pass
|
||||
|
||||
35
config/production.py
Normal file
35
config/production.py
Normal file
@@ -0,0 +1,35 @@
|
||||
"""
|
||||
生产环境配置
|
||||
"""
|
||||
from .base import Config
|
||||
|
||||
class ProductionConfig(Config):
|
||||
"""
|
||||
生产环境配置
|
||||
关闭调试模式,使用生产数据库
|
||||
"""
|
||||
DEBUG = False
|
||||
TESTING = False
|
||||
|
||||
# 生产环境必须使用生产数据库
|
||||
# 从环境变量获取,如果没有设置会抛出错误
|
||||
SQLALCHEMY_DATABASE_URI = Config.SQLALCHEMY_DATABASE_URI
|
||||
if not SQLALCHEMY_DATABASE_URI or SQLALCHEMY_DATABASE_URI.startswith('sqlite'):
|
||||
raise ValueError("生产环境必须配置非SQLite数据库")
|
||||
|
||||
# 生产环境日志级别
|
||||
LOG_LEVEL = 'INFO'
|
||||
|
||||
# 生产环境限制跨域来源
|
||||
# 应该从环境变量获取,格式: https://yourdomain.com,https://www.yourdomain.com
|
||||
CORS_ORIGINS = Config.CORS_ORIGINS
|
||||
if CORS_ORIGINS == ['*']:
|
||||
import warnings
|
||||
warnings.warn("生产环境CORS_ORIGINS设置为'*'存在安全风险,请配置具体域名")
|
||||
|
||||
# 生产环境安全配置
|
||||
WTF_CSRF_ENABLED = True
|
||||
SESSION_COOKIE_SECURE = True # 仅HTTPS传输
|
||||
SESSION_COOKIE_HTTPONLY = True # 防止XSS
|
||||
SESSION_COOKIE_SAMESITE = 'Lax' # CSRF保护
|
||||
|
||||
25
config/testing.py
Normal file
25
config/testing.py
Normal file
@@ -0,0 +1,25 @@
|
||||
"""
|
||||
测试环境配置
|
||||
"""
|
||||
from .base import Config
|
||||
|
||||
class TestingConfig(Config):
|
||||
"""
|
||||
测试环境配置
|
||||
使用内存数据库,关闭CSRF保护
|
||||
"""
|
||||
DEBUG = True
|
||||
TESTING = True
|
||||
|
||||
# 测试环境使用内存数据库
|
||||
SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'
|
||||
|
||||
# 测试环境关闭CSRF保护
|
||||
WTF_CSRF_ENABLED = False
|
||||
|
||||
# 测试环境日志级别
|
||||
LOG_LEVEL = 'DEBUG'
|
||||
|
||||
# 测试环境允许所有跨域请求
|
||||
CORS_ORIGINS = ['*']
|
||||
|
||||
25
docs/README.md
Normal file
25
docs/README.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# 项目文档
|
||||
|
||||
## 文档结构
|
||||
|
||||
- `api/` - API接口文档
|
||||
- `development/` - 开发相关文档
|
||||
- `deployment/` - 部署相关文档
|
||||
|
||||
## 文档管理规范
|
||||
|
||||
1. 所有文档必须包含:
|
||||
- 目标 | 版本号 | 责任人 | 最后更新日期
|
||||
- 变更记录(含修改人、修改内容)
|
||||
- 关联资源链接(代码库/任务编号)
|
||||
|
||||
2. 文档更新必须:
|
||||
- 更新版本号(语义化版本 v<主>.<次>.<补丁>)
|
||||
- 提交变更日志(>50字说明)
|
||||
|
||||
## 快速链接
|
||||
|
||||
- [API文档](./api/README.md)
|
||||
- [开发文档](./development/README.md)
|
||||
- [部署文档](./deployment/README.md)
|
||||
|
||||
57
docs/api/README.md
Normal file
57
docs/api/README.md
Normal file
@@ -0,0 +1,57 @@
|
||||
# API接口文档
|
||||
|
||||
## 版本信息
|
||||
|
||||
- 版本: v1.0.0
|
||||
- 最后更新: 2025-01-XX
|
||||
- 维护者: 开发团队
|
||||
|
||||
## API基础信息
|
||||
|
||||
- 基础URL: `http://localhost:5000/api/v1`
|
||||
- 认证方式: Bearer Token(如需要)
|
||||
- 数据格式: JSON
|
||||
|
||||
## 接口列表
|
||||
|
||||
### 健康检查
|
||||
|
||||
**GET** `/health`
|
||||
|
||||
检查服务健康状态
|
||||
|
||||
**响应示例:**
|
||||
```json
|
||||
{
|
||||
"status": "healthy"
|
||||
}
|
||||
```
|
||||
|
||||
### 首页
|
||||
|
||||
**GET** `/`
|
||||
|
||||
获取首页信息
|
||||
|
||||
**响应示例:**
|
||||
```json
|
||||
{
|
||||
"message": "Hello, World!",
|
||||
"status": "ok"
|
||||
}
|
||||
```
|
||||
|
||||
## 错误码说明
|
||||
|
||||
- `200` - 成功
|
||||
- `400` - 请求参数错误
|
||||
- `401` - 未授权
|
||||
- `404` - 资源不存在
|
||||
- `500` - 服务器内部错误
|
||||
|
||||
## 变更记录
|
||||
|
||||
### v1.0.0 (2025-01-XX)
|
||||
- 初始版本
|
||||
- 添加健康检查和首页接口
|
||||
|
||||
101
docs/deployment/README.md
Normal file
101
docs/deployment/README.md
Normal file
@@ -0,0 +1,101 @@
|
||||
# 部署文档
|
||||
|
||||
## 版本信息
|
||||
|
||||
- 版本: v1.0.0
|
||||
- 最后更新: 2025-01-XX
|
||||
- 维护者: 运维团队
|
||||
|
||||
## 部署前准备
|
||||
|
||||
### 1. 环境要求
|
||||
|
||||
- Python 3.8+
|
||||
- 数据库(MySQL/PostgreSQL/SQLite)
|
||||
- 反向代理(Nginx,可选)
|
||||
|
||||
### 2. 安装依赖
|
||||
|
||||
```bash
|
||||
# 安装生产依赖
|
||||
pip install -r requirements/base.txt
|
||||
pip install -r requirements/production.txt
|
||||
```
|
||||
|
||||
### 3. 配置环境变量
|
||||
|
||||
```bash
|
||||
# 设置生产环境
|
||||
export FLASK_ENV=production
|
||||
|
||||
# 配置必要的环境变量
|
||||
# - SECRET_KEY
|
||||
# - DATABASE_URL
|
||||
# - CORS_ORIGINS
|
||||
```
|
||||
|
||||
## 部署方式
|
||||
|
||||
### 方式1: 使用Gunicorn
|
||||
|
||||
```bash
|
||||
# 使用配置文件
|
||||
gunicorn -c gunicorn.conf.py "src.your_app:create_app()"
|
||||
|
||||
# 或直接指定参数
|
||||
gunicorn --bind 0.0.0.0:5000 --workers 4 "src.your_app:create_app()"
|
||||
```
|
||||
|
||||
### 方式2: 使用uWSGI
|
||||
|
||||
```bash
|
||||
uwsgi --ini uwsgi.ini
|
||||
```
|
||||
|
||||
### 方式3: 使用Docker
|
||||
|
||||
```bash
|
||||
# 构建镜像
|
||||
docker build -t your_app .
|
||||
|
||||
# 运行容器
|
||||
docker run -d -p 5000:5000 --env-file .env your_app
|
||||
```
|
||||
|
||||
## Nginx配置示例
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name your_domain.com;
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:5000;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 监控和日志
|
||||
|
||||
### 日志位置
|
||||
|
||||
- 应用日志: `logs/app.log`
|
||||
- Gunicorn访问日志: `logs/gunicorn_access.log`
|
||||
- Gunicorn错误日志: `logs/gunicorn_error.log`
|
||||
|
||||
### 监控建议
|
||||
|
||||
- 使用Supervisor管理进程
|
||||
- 配置日志轮转
|
||||
- 设置健康检查端点
|
||||
|
||||
## 变更记录
|
||||
|
||||
### v1.0.0 (2025-01-XX)
|
||||
- 初始版本
|
||||
- 添加部署文档
|
||||
|
||||
131
docs/development/README.md
Normal file
131
docs/development/README.md
Normal file
@@ -0,0 +1,131 @@
|
||||
# 开发文档
|
||||
|
||||
## 版本信息
|
||||
|
||||
- 版本: v1.0.0
|
||||
- 最后更新: 2025-01-XX
|
||||
- 维护者: 开发团队
|
||||
|
||||
## 开发环境搭建
|
||||
|
||||
### 1. 环境要求
|
||||
|
||||
- Python 3.8+
|
||||
- pip
|
||||
- 虚拟环境工具(venv)
|
||||
|
||||
### 2. 安装步骤
|
||||
|
||||
```bash
|
||||
# 创建虚拟环境
|
||||
python -m venv .venv
|
||||
|
||||
# 激活虚拟环境
|
||||
# Windows
|
||||
.venv\Scripts\activate
|
||||
# Linux/Mac
|
||||
source .venv/bin/activate
|
||||
|
||||
# 安装依赖
|
||||
pip install -r requirements/base.txt
|
||||
pip install -r requirements/development.txt
|
||||
```
|
||||
|
||||
### 3. 配置环境变量
|
||||
|
||||
```bash
|
||||
# 复制环境变量模板
|
||||
cp env.example .env
|
||||
|
||||
# 编辑.env文件
|
||||
# 至少需要配置:
|
||||
# - SECRET_KEY
|
||||
# - DATABASE_URL
|
||||
# - FLASK_ENV
|
||||
```
|
||||
|
||||
### 4. 初始化数据库
|
||||
|
||||
```bash
|
||||
# 初始化迁移
|
||||
flask db init
|
||||
|
||||
# 创建初始迁移
|
||||
flask db migrate -m "Initial migration"
|
||||
|
||||
# 应用迁移
|
||||
flask db upgrade
|
||||
```
|
||||
|
||||
### 5. 运行项目
|
||||
|
||||
```bash
|
||||
python run_dev.py
|
||||
```
|
||||
|
||||
## 代码规范
|
||||
|
||||
### 代码风格
|
||||
|
||||
- 使用Black进行代码格式化
|
||||
- 使用isort进行导入排序
|
||||
- 遵循PEP 8规范
|
||||
|
||||
### 代码检查
|
||||
|
||||
```bash
|
||||
# 格式化代码
|
||||
black src/
|
||||
|
||||
# 排序导入
|
||||
isort src/
|
||||
|
||||
# 检查代码
|
||||
flake8 src/
|
||||
pylint src/
|
||||
```
|
||||
|
||||
## 测试
|
||||
|
||||
### 运行测试
|
||||
|
||||
```bash
|
||||
# 安装测试依赖
|
||||
pip install -r requirements/test.txt
|
||||
|
||||
# 运行所有测试
|
||||
pytest
|
||||
|
||||
# 运行特定测试
|
||||
pytest tests/test_example.py
|
||||
|
||||
# 生成覆盖率报告
|
||||
pytest --cov=src tests/
|
||||
```
|
||||
|
||||
## 数据库迁移
|
||||
|
||||
### 创建迁移
|
||||
|
||||
```bash
|
||||
flask db migrate -m "描述信息"
|
||||
```
|
||||
|
||||
### 应用迁移
|
||||
|
||||
```bash
|
||||
flask db upgrade
|
||||
```
|
||||
|
||||
### 回滚迁移
|
||||
|
||||
```bash
|
||||
flask db downgrade
|
||||
```
|
||||
|
||||
## 变更记录
|
||||
|
||||
### v1.0.0 (2025-01-XX)
|
||||
- 初始版本
|
||||
- 添加开发环境搭建文档
|
||||
|
||||
81
env.example
Normal file
81
env.example
Normal file
@@ -0,0 +1,81 @@
|
||||
# ========================================
|
||||
# Python项目环境变量配置示例
|
||||
# ========================================
|
||||
# 复制此文件为 .env 并根据实际情况修改配置
|
||||
# cp env.example .env
|
||||
|
||||
# ========================================
|
||||
# Flask基础配置
|
||||
# ========================================
|
||||
# Flask应用密钥(必需,用于会话加密等)
|
||||
# 生成方式: python -c "import secrets; print(secrets.token_hex(32))"
|
||||
SECRET_KEY=your-secret-key-here-change-this-in-production
|
||||
|
||||
# 应用环境(development/production/testing/local)
|
||||
FLASK_ENV=development
|
||||
|
||||
# 调试模式(开发环境建议True,生产环境必须False)
|
||||
FLASK_DEBUG=True
|
||||
|
||||
# ========================================
|
||||
# 数据库配置
|
||||
# ========================================
|
||||
# 数据库连接URL(必需)
|
||||
# MySQL示例: mysql+pymysql://username:password@localhost:3306/database_name?charset=utf8mb4
|
||||
# SQLite示例: sqlite:///app.db
|
||||
# PostgreSQL示例: postgresql://username:password@localhost:5432/database_name
|
||||
DATABASE_URL=sqlite:///app.db
|
||||
|
||||
# ========================================
|
||||
# 跨域配置
|
||||
# ========================================
|
||||
# 允许跨域的域名,多个用逗号分隔
|
||||
# 开发环境: http://localhost:3000,http://127.0.0.1:3000
|
||||
# 生产环境: https://yourdomain.com,https://www.yourdomain.com
|
||||
CORS_ORIGINS=http://localhost:3000,http://127.0.0.1:3000
|
||||
|
||||
# ========================================
|
||||
# 日志配置
|
||||
# ========================================
|
||||
# 日志级别(DEBUG/INFO/WARNING/ERROR/CRITICAL)
|
||||
LOG_LEVEL=INFO
|
||||
|
||||
# 日志文件路径
|
||||
LOG_FILE=logs/app.log
|
||||
|
||||
# ========================================
|
||||
# 缓存配置
|
||||
# ========================================
|
||||
# 缓存类型(simple/redis/memcached)
|
||||
CACHE_TYPE=simple
|
||||
|
||||
# 缓存默认超时时间(秒)
|
||||
CACHE_DEFAULT_TIMEOUT=300
|
||||
|
||||
# Redis缓存URL(当CACHE_TYPE=redis时使用)
|
||||
# REDIS_URL=redis://localhost:6379/0
|
||||
|
||||
# ========================================
|
||||
# 会话配置
|
||||
# ========================================
|
||||
# 会话生命周期(小时)
|
||||
SESSION_LIFETIME_HOURS=24
|
||||
|
||||
# ========================================
|
||||
# 文件上传配置
|
||||
# ========================================
|
||||
# 最大文件上传大小(字节,默认16MB)
|
||||
MAX_CONTENT_LENGTH=16777216
|
||||
|
||||
# 文件上传目录
|
||||
UPLOAD_FOLDER=uploads
|
||||
|
||||
# ========================================
|
||||
# 安全配置
|
||||
# ========================================
|
||||
# 是否启用CSRF保护
|
||||
WTF_CSRF_ENABLED=True
|
||||
|
||||
# CSRF令牌超时时间(秒)
|
||||
WTF_CSRF_TIME_LIMIT=3600
|
||||
|
||||
39
gunicorn.conf.py
Normal file
39
gunicorn.conf.py
Normal file
@@ -0,0 +1,39 @@
|
||||
"""
|
||||
Gunicorn配置文件
|
||||
生产环境使用
|
||||
"""
|
||||
import multiprocessing
|
||||
import os
|
||||
|
||||
# 服务器socket
|
||||
bind = f"0.0.0.0:{os.environ.get('PORT', 5000)}"
|
||||
backlog = 2048
|
||||
|
||||
# 工作进程
|
||||
workers = multiprocessing.cpu_count() * 2 + 1
|
||||
worker_class = 'sync'
|
||||
worker_connections = 1000
|
||||
timeout = 30
|
||||
keepalive = 2
|
||||
|
||||
# 日志
|
||||
accesslog = 'logs/gunicorn_access.log'
|
||||
errorlog = 'logs/gunicorn_error.log'
|
||||
loglevel = 'info'
|
||||
access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'
|
||||
|
||||
# 进程命名
|
||||
proc_name = 'your_app'
|
||||
|
||||
# 服务器机制
|
||||
daemon = False
|
||||
pidfile = 'gunicorn.pid'
|
||||
umask = 0
|
||||
user = None
|
||||
group = None
|
||||
tmp_upload_dir = None
|
||||
|
||||
# SSL(如果需要)
|
||||
# keyfile = '/path/to/keyfile'
|
||||
# certfile = '/path/to/certfile'
|
||||
|
||||
22
pytest.ini
Normal file
22
pytest.ini
Normal file
@@ -0,0 +1,22 @@
|
||||
[pytest]
|
||||
# pytest配置文件
|
||||
testpaths = tests
|
||||
python_files = test_*.py
|
||||
python_classes = Test*
|
||||
python_functions = test_*
|
||||
|
||||
# 输出选项
|
||||
addopts =
|
||||
-v
|
||||
--strict-markers
|
||||
--tb=short
|
||||
--cov=src
|
||||
--cov-report=term-missing
|
||||
--cov-report=html
|
||||
|
||||
# 标记
|
||||
markers =
|
||||
unit: 单元测试
|
||||
integration: 集成测试
|
||||
slow: 慢速测试
|
||||
|
||||
19
requirements/base.txt
Normal file
19
requirements/base.txt
Normal file
@@ -0,0 +1,19 @@
|
||||
# 基础依赖 - 项目运行必需
|
||||
# Flask核心框架
|
||||
flask>=2.2.0
|
||||
|
||||
# 数据库ORM
|
||||
flask-sqlalchemy>=3.0.2
|
||||
|
||||
# 数据库迁移
|
||||
flask-migrate>=4.0.4
|
||||
|
||||
# 跨域支持
|
||||
flask-cors>=3.0.10
|
||||
|
||||
# 环境变量管理
|
||||
python-dotenv>=1.0.0
|
||||
|
||||
# HTTP请求库
|
||||
requests>=2.28.0
|
||||
|
||||
19
requirements/development.txt
Normal file
19
requirements/development.txt
Normal file
@@ -0,0 +1,19 @@
|
||||
# 开发依赖 - 开发工具
|
||||
# 包含base.txt的所有依赖
|
||||
-r base.txt
|
||||
|
||||
# 代码格式化
|
||||
black>=23.0.0
|
||||
isort>=5.12.0
|
||||
|
||||
# 代码检查
|
||||
flake8>=6.0.0
|
||||
pylint>=2.17.0
|
||||
|
||||
# 类型检查
|
||||
mypy>=1.0.0
|
||||
|
||||
# 调试工具
|
||||
flask-debugtoolbar>=0.13.0
|
||||
ipython>=8.12.0
|
||||
|
||||
16
requirements/production.txt
Normal file
16
requirements/production.txt
Normal file
@@ -0,0 +1,16 @@
|
||||
# 生产依赖 - 生产环境运行
|
||||
# 包含base.txt的所有依赖
|
||||
-r base.txt
|
||||
|
||||
# WSGI服务器
|
||||
gunicorn>=21.2.0
|
||||
|
||||
# 或使用uWSGI(二选一)
|
||||
# uwsgi>=2.0.21
|
||||
|
||||
# 进程管理
|
||||
supervisor>=4.2.5
|
||||
|
||||
# 性能监控
|
||||
psutil>=5.9.0
|
||||
|
||||
16
requirements/test.txt
Normal file
16
requirements/test.txt
Normal file
@@ -0,0 +1,16 @@
|
||||
# 测试依赖 - 测试框架和工具
|
||||
# 包含base.txt的所有依赖
|
||||
-r base.txt
|
||||
|
||||
# 测试框架
|
||||
pytest>=7.4.0
|
||||
pytest-flask>=1.2.0
|
||||
pytest-cov>=4.1.0
|
||||
|
||||
# 测试工具
|
||||
faker>=19.0.0
|
||||
freezegun>=1.2.2
|
||||
|
||||
# HTTP测试
|
||||
httpx>=0.24.0
|
||||
|
||||
26
run_dev.py
Normal file
26
run_dev.py
Normal file
@@ -0,0 +1,26 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
开发环境启动脚本
|
||||
"""
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
|
||||
# 加载环境变量
|
||||
load_dotenv()
|
||||
|
||||
# 设置开发环境
|
||||
os.environ.setdefault('FLASK_ENV', 'development')
|
||||
|
||||
from src.your_app import create_app
|
||||
|
||||
app = create_app()
|
||||
|
||||
if __name__ == '__main__':
|
||||
# 开发环境配置
|
||||
app.run(
|
||||
host='0.0.0.0',
|
||||
port=int(os.environ.get('PORT', 5000)),
|
||||
debug=True,
|
||||
use_reloader=True
|
||||
)
|
||||
|
||||
29
run_production.py
Normal file
29
run_production.py
Normal file
@@ -0,0 +1,29 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
生产环境启动脚本
|
||||
使用Gunicorn运行
|
||||
"""
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
|
||||
# 加载环境变量
|
||||
load_dotenv()
|
||||
|
||||
# 设置生产环境
|
||||
os.environ.setdefault('FLASK_ENV', 'production')
|
||||
|
||||
from src.your_app import create_app
|
||||
|
||||
app = create_app()
|
||||
|
||||
if __name__ == '__main__':
|
||||
# 生产环境应该使用Gunicorn或uWSGI
|
||||
# 此脚本仅用于测试
|
||||
print("警告: 生产环境请使用Gunicorn运行")
|
||||
print("命令: gunicorn -c gunicorn.conf.py 'src.your_app:create_app()'")
|
||||
app.run(
|
||||
host='0.0.0.0',
|
||||
port=int(os.environ.get('PORT', 5000)),
|
||||
debug=False
|
||||
)
|
||||
|
||||
80
scripts/init_project.py
Normal file
80
scripts/init_project.py
Normal file
@@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
项目初始化脚本
|
||||
用于快速初始化新项目
|
||||
"""
|
||||
import os
|
||||
import shutil
|
||||
import secrets
|
||||
import sys
|
||||
|
||||
def generate_secret_key():
|
||||
"""生成安全的密钥"""
|
||||
return secrets.token_hex(32)
|
||||
|
||||
def init_project():
|
||||
"""初始化项目"""
|
||||
print("=" * 50)
|
||||
print("Python项目初始化脚本")
|
||||
print("=" * 50)
|
||||
|
||||
# 获取项目名称
|
||||
project_name = input("请输入项目名称(用于替换your_app): ").strip()
|
||||
if not project_name:
|
||||
print("错误: 项目名称不能为空")
|
||||
sys.exit(1)
|
||||
|
||||
# 生成密钥
|
||||
secret_key = generate_secret_key()
|
||||
print(f"\n生成的SECRET_KEY: {secret_key}")
|
||||
|
||||
# 创建.env文件
|
||||
if not os.path.exists('.env'):
|
||||
print("\n创建.env文件...")
|
||||
shutil.copy('env.example', '.env')
|
||||
|
||||
# 替换SECRET_KEY
|
||||
with open('.env', 'r') as f:
|
||||
content = f.read()
|
||||
content = content.replace('your-secret-key-here-change-this-in-production', secret_key)
|
||||
with open('.env', 'w') as f:
|
||||
f.write(content)
|
||||
print("✓ .env文件已创建")
|
||||
else:
|
||||
print("⚠ .env文件已存在,跳过创建")
|
||||
|
||||
# 创建必要目录
|
||||
directories = ['logs', 'uploads', 'migrations']
|
||||
for directory in directories:
|
||||
if not os.path.exists(directory):
|
||||
os.makedirs(directory)
|
||||
print(f"✓ 创建目录: {directory}")
|
||||
|
||||
# 重命名应用目录(可选)
|
||||
rename = input(f"\n是否重命名应用目录 src/your_app 为 src/{project_name}? (y/n): ").strip().lower()
|
||||
if rename == 'y':
|
||||
old_path = 'src/your_app'
|
||||
new_path = f'src/{project_name}'
|
||||
if os.path.exists(old_path) and not os.path.exists(new_path):
|
||||
shutil.move(old_path, new_path)
|
||||
print(f"✓ 已重命名: {old_path} -> {new_path}")
|
||||
print(f"⚠ 请手动更新以下文件中的导入路径:")
|
||||
print(f" - run_dev.py")
|
||||
print(f" - run_production.py")
|
||||
print(f" - gunicorn.conf.py")
|
||||
print(f" - tests/conftest.py")
|
||||
print(f" - 所有测试文件")
|
||||
|
||||
print("\n" + "=" * 50)
|
||||
print("初始化完成!")
|
||||
print("=" * 50)
|
||||
print("\n下一步:")
|
||||
print("1. 编辑.env文件,配置数据库和其他设置")
|
||||
print("2. 安装依赖: pip install -r requirements/base.txt -r requirements/development.txt")
|
||||
print("3. 初始化数据库: flask db init && flask db migrate -m 'Initial migration' && flask db upgrade")
|
||||
print("4. 运行项目: python run_dev.py")
|
||||
print("\n")
|
||||
|
||||
if __name__ == '__main__':
|
||||
init_project()
|
||||
|
||||
84
src/your_app/__init__.py
Normal file
84
src/your_app/__init__.py
Normal file
@@ -0,0 +1,84 @@
|
||||
"""
|
||||
应用工厂模块
|
||||
使用工厂模式创建Flask应用实例
|
||||
"""
|
||||
from flask import Flask
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
from flask_migrate import Migrate
|
||||
from flask_cors import CORS
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
|
||||
# 加载环境变量
|
||||
load_dotenv()
|
||||
|
||||
# 导入配置系统
|
||||
from config import get_config
|
||||
|
||||
# 初始化扩展
|
||||
db = SQLAlchemy()
|
||||
migrate = Migrate()
|
||||
|
||||
def create_app(config_class=None):
|
||||
"""
|
||||
应用工厂函数
|
||||
创建并配置Flask应用实例
|
||||
|
||||
Args:
|
||||
config_class: 配置类,如果为None则自动根据环境变量选择
|
||||
|
||||
Returns:
|
||||
Flask应用实例
|
||||
"""
|
||||
app = Flask(__name__,
|
||||
template_folder='templates',
|
||||
static_folder='static')
|
||||
|
||||
# 如果没有指定配置类,使用配置系统自动选择
|
||||
if config_class is None:
|
||||
config_class = get_config()
|
||||
|
||||
# 加载配置
|
||||
app.config.from_object(config_class)
|
||||
|
||||
# 初始化配置
|
||||
config_class.init_app(app)
|
||||
|
||||
# 启用跨域支持
|
||||
CORS(app, origins=app.config.get('CORS_ORIGINS', ['*']))
|
||||
|
||||
# 初始化扩展
|
||||
db.init_app(app)
|
||||
migrate.init_app(app, db)
|
||||
|
||||
# 注册蓝图
|
||||
from src.your_app.routes import main_bp
|
||||
app.register_blueprint(main_bp)
|
||||
|
||||
# TODO: 在这里注册你的其他蓝图
|
||||
# from src.your_app.routes.api import api_bp
|
||||
# app.register_blueprint(api_bp)
|
||||
|
||||
# 注册错误处理
|
||||
register_error_handlers(app)
|
||||
|
||||
# 记录应用启动信息
|
||||
app.logger.info(f"应用启动 - 环境: {os.environ.get('FLASK_ENV', 'development')}")
|
||||
app.logger.info(f"调试模式: {app.config.get('DEBUG', False)}")
|
||||
app.logger.info(f"数据库: {app.config.get('SQLALCHEMY_DATABASE_URI', 'Not set')}")
|
||||
|
||||
return app
|
||||
|
||||
def register_error_handlers(app):
|
||||
"""
|
||||
注册错误处理函数
|
||||
"""
|
||||
@app.errorhandler(404)
|
||||
def not_found(error):
|
||||
return {'error': 'Not found'}, 404
|
||||
|
||||
@app.errorhandler(500)
|
||||
def internal_error(error):
|
||||
db.session.rollback()
|
||||
return {'error': 'Internal server error'}, 500
|
||||
|
||||
11
src/your_app/app.py
Normal file
11
src/your_app/app.py
Normal file
@@ -0,0 +1,11 @@
|
||||
"""
|
||||
应用入口文件
|
||||
可以直接运行此文件启动应用
|
||||
"""
|
||||
from src.your_app import create_app
|
||||
|
||||
app = create_app()
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(host='0.0.0.0', port=5000, debug=True)
|
||||
|
||||
12
src/your_app/models/__init__.py
Normal file
12
src/your_app/models/__init__.py
Normal file
@@ -0,0 +1,12 @@
|
||||
"""
|
||||
数据模型模块
|
||||
"""
|
||||
from src.your_app import db
|
||||
|
||||
# 导入所有模型,确保它们被注册
|
||||
# from .user import User
|
||||
# from .example import Example
|
||||
|
||||
# 导出db实例,方便在其他模块使用
|
||||
__all__ = ['db']
|
||||
|
||||
35
src/your_app/models/example.py
Normal file
35
src/your_app/models/example.py
Normal file
@@ -0,0 +1,35 @@
|
||||
"""
|
||||
示例模型
|
||||
展示如何定义数据模型
|
||||
"""
|
||||
from datetime import datetime
|
||||
from src.your_app import db
|
||||
|
||||
class Example(db.Model):
|
||||
"""
|
||||
示例模型
|
||||
可以根据实际需求修改
|
||||
"""
|
||||
__tablename__ = 'examples'
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
name = db.Column(db.String(100), nullable=False)
|
||||
description = db.Column(db.Text)
|
||||
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
||||
|
||||
def __repr__(self):
|
||||
return f'<Example {self.name}>'
|
||||
|
||||
def to_dict(self):
|
||||
"""
|
||||
转换为字典,用于JSON序列化
|
||||
"""
|
||||
return {
|
||||
'id': self.id,
|
||||
'name': self.name,
|
||||
'description': self.description,
|
||||
'created_at': self.created_at.isoformat() if self.created_at else None,
|
||||
'updated_at': self.updated_at.isoformat() if self.updated_at else None,
|
||||
}
|
||||
|
||||
22
src/your_app/routes/__init__.py
Normal file
22
src/your_app/routes/__init__.py
Normal file
@@ -0,0 +1,22 @@
|
||||
"""
|
||||
路由模块
|
||||
"""
|
||||
from flask import Blueprint
|
||||
|
||||
# 创建主蓝图
|
||||
main_bp = Blueprint('main', __name__)
|
||||
|
||||
@main_bp.route('/')
|
||||
def index():
|
||||
"""
|
||||
首页路由
|
||||
"""
|
||||
return {'message': 'Hello, World!', 'status': 'ok'}
|
||||
|
||||
@main_bp.route('/health')
|
||||
def health():
|
||||
"""
|
||||
健康检查路由
|
||||
"""
|
||||
return {'status': 'healthy'}
|
||||
|
||||
5
src/your_app/services/__init__.py
Normal file
5
src/your_app/services/__init__.py
Normal file
@@ -0,0 +1,5 @@
|
||||
"""
|
||||
业务逻辑服务模块
|
||||
将业务逻辑从路由中分离出来
|
||||
"""
|
||||
|
||||
2
src/your_app/static/.gitkeep
Normal file
2
src/your_app/static/.gitkeep
Normal file
@@ -0,0 +1,2 @@
|
||||
# 静态文件目录占位符
|
||||
|
||||
2
src/your_app/templates/.gitkeep
Normal file
2
src/your_app/templates/.gitkeep
Normal file
@@ -0,0 +1,2 @@
|
||||
# 模板文件目录占位符
|
||||
|
||||
25
src/your_app/templates/base.html
Normal file
25
src/your_app/templates/base.html
Normal file
@@ -0,0 +1,25 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{% block title %}Flask应用{% endblock %}</title>
|
||||
{% block head %}{% endblock %}
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<h1>{% block header %}欢迎{% endblock %}</h1>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
{% block content %}{% endblock %}
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
{% block footer %}{% endblock %}
|
||||
</footer>
|
||||
|
||||
{% block scripts %}{% endblock %}
|
||||
</body>
|
||||
</html>
|
||||
|
||||
19
src/your_app/templates/index.html
Normal file
19
src/your_app/templates/index.html
Normal file
@@ -0,0 +1,19 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}首页{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<h1>欢迎使用Flask应用模板</h1>
|
||||
<p>这是一个基础模板,你可以在此基础上构建你的应用。</p>
|
||||
|
||||
<div class="info">
|
||||
<h2>快速链接</h2>
|
||||
<ul>
|
||||
<li><a href="/">首页</a></li>
|
||||
<li><a href="/health">健康检查</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
5
src/your_app/utils/__init__.py
Normal file
5
src/your_app/utils/__init__.py
Normal file
@@ -0,0 +1,5 @@
|
||||
"""
|
||||
工具函数模块
|
||||
包含各种辅助函数
|
||||
"""
|
||||
|
||||
52
src/your_app/utils/helpers.py
Normal file
52
src/your_app/utils/helpers.py
Normal file
@@ -0,0 +1,52 @@
|
||||
"""
|
||||
辅助工具函数
|
||||
"""
|
||||
from datetime import datetime
|
||||
from typing import Any, Dict
|
||||
|
||||
def format_datetime(dt: datetime) -> str:
|
||||
"""
|
||||
格式化日期时间为字符串
|
||||
|
||||
Args:
|
||||
dt: datetime对象
|
||||
|
||||
Returns:
|
||||
格式化后的字符串
|
||||
"""
|
||||
return dt.strftime('%Y-%m-%d %H:%M:%S') if dt else None
|
||||
|
||||
def success_response(data: Any = None, message: str = 'success') -> Dict:
|
||||
"""
|
||||
创建成功响应
|
||||
|
||||
Args:
|
||||
data: 响应数据
|
||||
message: 响应消息
|
||||
|
||||
Returns:
|
||||
响应字典
|
||||
"""
|
||||
return {
|
||||
'code': 200,
|
||||
'message': message,
|
||||
'data': data
|
||||
}
|
||||
|
||||
def error_response(message: str = 'error', code: int = 400) -> Dict:
|
||||
"""
|
||||
创建错误响应
|
||||
|
||||
Args:
|
||||
message: 错误消息
|
||||
code: 错误代码
|
||||
|
||||
Returns:
|
||||
响应字典
|
||||
"""
|
||||
return {
|
||||
'code': code,
|
||||
'message': message,
|
||||
'data': None
|
||||
}
|
||||
|
||||
4
tests/__init__.py
Normal file
4
tests/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
"""
|
||||
测试模块
|
||||
"""
|
||||
|
||||
34
tests/conftest.py
Normal file
34
tests/conftest.py
Normal file
@@ -0,0 +1,34 @@
|
||||
"""
|
||||
pytest配置文件
|
||||
定义测试fixtures
|
||||
"""
|
||||
import pytest
|
||||
from src.your_app import create_app, db
|
||||
from config import TestingConfig
|
||||
|
||||
@pytest.fixture
|
||||
def app():
|
||||
"""
|
||||
创建测试应用实例
|
||||
"""
|
||||
app = create_app(TestingConfig)
|
||||
|
||||
with app.app_context():
|
||||
db.create_all()
|
||||
yield app
|
||||
db.drop_all()
|
||||
|
||||
@pytest.fixture
|
||||
def client(app):
|
||||
"""
|
||||
创建测试客户端
|
||||
"""
|
||||
return app.test_client()
|
||||
|
||||
@pytest.fixture
|
||||
def runner(app):
|
||||
"""
|
||||
创建CLI测试运行器
|
||||
"""
|
||||
return app.test_cli_runner()
|
||||
|
||||
39
tests/test_example.py
Normal file
39
tests/test_example.py
Normal file
@@ -0,0 +1,39 @@
|
||||
"""
|
||||
示例测试文件
|
||||
展示如何编写测试
|
||||
"""
|
||||
import pytest
|
||||
from src.your_app import db
|
||||
from src.your_app.models.example import Example
|
||||
|
||||
def test_index(client):
|
||||
"""
|
||||
测试首页路由
|
||||
"""
|
||||
response = client.get('/')
|
||||
assert response.status_code == 200
|
||||
data = response.get_json()
|
||||
assert data['status'] == 'ok'
|
||||
|
||||
def test_health(client):
|
||||
"""
|
||||
测试健康检查路由
|
||||
"""
|
||||
response = client.get('/health')
|
||||
assert response.status_code == 200
|
||||
data = response.get_json()
|
||||
assert data['status'] == 'healthy'
|
||||
|
||||
def test_example_model(app):
|
||||
"""
|
||||
测试示例模型
|
||||
"""
|
||||
with app.app_context():
|
||||
example = Example(name='Test', description='Test description')
|
||||
db.session.add(example)
|
||||
db.session.commit()
|
||||
|
||||
assert example.id is not None
|
||||
assert example.name == 'Test'
|
||||
assert example.description == 'Test description'
|
||||
|
||||
Reference in New Issue
Block a user