1. MyBoot 是什么?
- Python 世界的 Spring Boot 影子
- 约定优于配置 + 自动配置 + 依赖注入
- 内置 Hypercorn(HTTP/2)、Cron、健康检查、优雅关机、Swagger…
- 单文件即可启动,也能按「Controller-Service-Repository」分层
| Spring Boot | MyBoot 等价 |
|---|---|
@SpringBootApplication |
create_app() |
@RestController |
@RestController(同名) |
@Service |
@service() |
@GetMapping |
@get(...) |
application.yml |
conf/config.yaml |
| DevTools | --reload 自动重载 |
2. 30 秒初始化项目
pip install -U myboot
myboot init --name user-crud-app --template basic
cd user-crud-app
tree -L 2
目录结构(已对齐 Maven 习惯):
user-crud-app
├── main.py
├── app
│ ├── api/ # ← Controller
│ ├── service/ # ← Service
│ ├── model/ # ← DTO/Entity
│ └── ...
├── conf
│ └── config.yaml
└── tests/
3. 定义模型(Pydantic 版 DTO)
app/model/user.py
from pydantic import BaseModel, Field
from typing import Optional
class User(BaseModel):
id: Optional[int] = None
name: str
email: str
age: Optional[int] = None
class UserCreate(User):
id: None = None # 创建时不允许带 id
class UserUpdate(BaseModel):
name: Optional[str] = None
email: Optional[str] = None
age: Optional[int] = None
4. Service + 依赖注入
app/service/user_service.py
from typing import List, Optional, Dict
from myboot import service
from app.model.user import User, UserCreate, UserUpdate
@service() # ← 等价于 @Service
class UserService:
_db: Dict[int, User] = {
}
_seq: int = 1
def get_all(self) -> List[User]:
return list(self._db.values())
def get(self, uid: int) -> Optional[User]:
return self._db.get(uid)
def create(self, dto: UserCreate) -> User:
user = User(id=self._seq, **dto.dict())
self._db[self._seq] = user
self._seq += 1
return user
def update(self, uid: int, dto: UserUpdate) -> Optional[User]:
user = self._db.get(uid)
if not user:
return None
for k, v in dto.dict(exclude_unset=True).items():
setattr(user, k, v)
return user
def delete(self, uid: int) -> bool:
return self._db.pop(uid, None) is not None
内存 Map 模拟 DB,重点看
@service()即可。
5. Controller & 统一返回体
app/api/routes.py
from typing import List
from myboot import RestController, get, post, put, delete
from myboot.web import BaseResponse
from app.model.user import User, UserCreate, UserUpdate
from app.service.user_service import UserService
@RestController
class UserController:
# 构造器注入(官方 IoC 容器自动装配)
def __init__(self, svc: UserService):
self.svc = svc
@post("/users", response_model=BaseResponse[User])
def create(self, dto: UserCreate) -> BaseResponse[User]:
return BaseResponse.success(self.svc.create(dto))
@get("/users", response_model=BaseResponse[List[User]])
def list(self) -> BaseResponse[List[User]]:
return BaseResponse.success(self.svc.get_all())
@get("/users/{uid}", response_model=BaseResponse[User])
def get(self, uid: int) -> BaseResponse[User]:
user = self.svc.get(uid)
return BaseResponse.success(user) if user else BaseResponse.not_found()
@put("/users/{uid}", response_model=BaseResponse[User])
def update(self, uid: int, dto: UserUpdate) -> BaseResponse[User]:
user = self.svc.update(uid, dto)
return BaseResponse.success(user) if user else BaseResponse.not_found()
@delete("/users/{uid}", response_model=BaseResponse[str])
def delete(self, uid: int) -> BaseResponse[str]:
ok = self.svc.delete(uid)
return BaseResponse.success("deleted") if ok else BaseResponse.not_found()
BaseResponse已内置success/data/message/code,前端无需再封装。
6. 启动类
main.py
from myboot import create_app
app = create_app(name="user-crud")
# 自动扫描同级 app 包下的所有 @RestController / @service
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000, reload=True)
一行配置都不写,默认读取
conf/config.yaml与.env。
7. 运行 & 实测
python main.py
响应示例:
{
"code": 0,
"message": "OK",
"data": {
"id": 1, "name": "Tom", "email": "tom@a.com", "age": 30 }
}
8. 打包部署
myboot build # 生成 dist/user-crud-0.0.1-bin.tar.gz
tar -xzf dist/user-crud-0.0.1-bin.tar.gz
./bin/user-crud start # 生产环境 systemd 可直接托管
9. 小结
- 全程只写 业务代码,无样板配置
- 注解与 Spring Boot 同名同义,秒切换技术栈
- 自带依赖注入、统一返回、热加载、Swagger、健康检查等企业级刚需