# Python实战项目
# 项目结构
project/
├── app/
│ ├── __init__.py
│ ├── models/ # 数据模型
│ ├── views/ # 视图/路由
│ ├── services/ # 业务逻辑
│ ├── utils/ # 工具函数
│ └── config.py # 配置
├── tests/ # 测试
├── requirements.txt # 依赖
├── .env # 环境变量
└── main.py # 入口文件
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 完整示例:RESTful API
# Flask项目
# app/__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from config import Config
db = SQLAlchemy()
migrate = Migrate()
def create_app(config_class=Config):
app = Flask(__name__)
app.config.from_object(config_class)
db.init_app(app)
migrate.init_app(app, db)
from app.views import api_bp
app.register_blueprint(api_bp)
return app
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 数据模型
# app/models/user.py
from app import db
from datetime import datetime
class User(db.Model):
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)
def to_dict(self):
return {
'id': self.id,
'username': self.username,
'email': self.email,
'created_at': self.created_at.isoformat()
}
def __repr__(self):
return f'<User {self.username}>'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 业务逻辑
# app/services/user_service.py
from app.models.user import User
from app import db
class UserService:
@staticmethod
def create_user(username, email):
if User.query.filter_by(username=username).first():
raise ValueError('Username already exists')
if User.query.filter_by(email=email).first():
raise ValueError('Email already exists')
user = User(username=username, email=email)
db.session.add(user)
db.session.commit()
return user
@staticmethod
def get_user(user_id):
return User.query.get_or_404(user_id)
@staticmethod
def get_all_users():
return User.query.all()
@staticmethod
def update_user(user_id, **kwargs):
user = User.query.get_or_404(user_id)
for key, value in kwargs.items():
if hasattr(user, key):
setattr(user, key, value)
db.session.commit()
return user
@staticmethod
def delete_user(user_id):
user = User.query.get_or_404(user_id)
db.session.delete(user)
db.session.commit()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# API路由
# app/views/api.py
from flask import Blueprint, request, jsonify
from app.services.user_service import UserService
api_bp = Blueprint('api', __name__, url_prefix='/api')
@api_bp.route('/users', methods=['POST'])
def create_user():
data = request.get_json()
try:
user = UserService.create_user(
username=data['username'],
email=data['email']
)
return jsonify(user.to_dict()), 201
except ValueError as e:
return jsonify({'error': str(e)}), 400
@api_bp.route('/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
user = UserService.get_user(user_id)
return jsonify(user.to_dict())
@api_bp.route('/users', methods=['GET'])
def get_all_users():
users = UserService.get_all_users()
return jsonify([user.to_dict() for user in users])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 测试
# tests/test_user_service.py
import unittest
from app import create_app, db
from app.models.user import User
from app.services.user_service import UserService
class UserServiceTestCase(unittest.TestCase):
def setUp(self):
self.app = create_app('testing')
self.app_context = self.app.app_context()
self.app_context.push()
db.create_all()
def tearDown(self):
db.session.remove()
db.drop_all()
self.app_context.pop()
def test_create_user(self):
user = UserService.create_user('testuser', 'test@example.com')
self.assertIsNotNone(user.id)
self.assertEqual(user.username, 'testuser')
def test_get_user(self):
user = UserService.create_user('testuser', 'test@example.com')
found_user = UserService.get_user(user.id)
self.assertEqual(found_user.id, user.id)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 最佳实践总结
# 1. 项目结构
- 模块化: 按功能拆分模块
- 分层架构: Models-Services-Views
- 配置管理: 使用环境变量
# 2. 代码质量
- 类型提示: 使用typing模块
- 文档字符串: 为函数添加docstring
- 代码规范: 遵循PEP 8
- 静态检查: 使用mypy
# 3. 测试
- 单元测试: unittest或pytest
- 集成测试: 测试API端点
- 覆盖率: 使用coverage.py
# 4. 部署
- 虚拟环境: 使用venv隔离依赖
- 依赖管理: requirements.txt
- 容器化: Docker部署
- CI/CD: GitHub Actions或GitLab CI
← Python进阶