搭建整个项目的完整流程以及相关代码:
1. 创建项目结构
创建一个名为my_project
的项目文件夹,并在其中创建所需的子文件夹和文件。
my_project/
├── app/
│ ├── __init__.py
│ ├── api/
│ │ ├── __init__.py
│ │ ├── user_routes.py
│ │ └── post_routes.py
│ ├── service/
│ │ ├── __init__.py
│ │ └── service.py
│ ├── config/
│ │ ├── __init__.py
│ │ └── config.py
│ ├── db/
│ │ ├── __init__.py
│ │ └── database.py
│ ├── cache/
│ │ ├── __init__.py
│ │ └── cache.py
│ └── logger/
│ ├── __init__.py
│ └── logger.py
├── main.py
└── requirements.txt
2. 安装依赖项
在项目文件夹中创建一个名为requirements.txt
的文件,包含项目所需的依赖项。
plaintext
fastapi
uvicorn
databases
asyncpg
aioredis
运行以下命令安装依赖项:
bash
pip install -r requirements.txt
3. 编写配置文件
在app/config/config.py
中,添加数据库和Redis的连接信息。
python
DATABASE_URL = "postgresql://user:password@localhost/db_name"
REDIS_URL = "redis://localhost"
4. 设置日志
创建日志文件app/logger/logger.py
,设置日志记录器。
python
import logging
def setup_logger():
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch = logging.StreamHandler()
ch.setFormatter(formatter)
logger.addHandler(ch)
fh = logging.FileHandler('app.log')
fh.setFormatter(formatter)
logger.addHandler(fh)
return logger
logger = setup_logger()
5. 数据库连接
创建数据库连接文件app/db/database.py
,设置连接函数和关闭函数。
python
import asyncpg
from app.config.config import DATABASE_URL
async def connect_to_db():
return await asyncpg.connect(DATABASE_URL)
async def close_db_connection(connection):
await connection.close()
6. Redis连接
创建Redis连接文件app/cache/cache.py
,设置连接函数和关闭函数。
python
import aioredis
from app.config.config import REDIS_URL
async def create_redis_pool():
return await aioredis.create_redis_pool(REDIS_URL)
async def close_redis_pool(pool):
pool.close()
await pool.wait_closed()
7. 服务层
创建服务文件app/service/service.py
,编写业务逻辑。
在 Service 中编写数据库查询逻辑
在 app/service/service.py
文件中,编写相应的数据库查询逻辑。假设我们要查询用户信息,可以像这样:
python
from app.db.database import connect_to_db, close_db_connection
from app.logger.logger import logger
async def get_user_by_id(user_id: int):
try:
logger.info(f"查询用户 ID: {user_id}...")
async with connect_to_db() as connection:
query = "SELECT * FROM users WHERE id = $1"
user = await connection.fetchrow(query, user_id)
return user
except Exception as e:
logger.error(f"查询用户时出错: {e}")
return None
调用 Service 中的函数
在 API 路由中调用 Service 中的函数。假设我们要编写一个获取用户信息的 API,可以这样编写:
python
# app/api/user_routes.py
from fastapi import APIRouter
from app.service.service import get_user_by_id
from app.logger.logger import logger
router = APIRouter()
@router.get("/users/{user_id}")
async def get_user(user_id: int):
try:
user = await get_user_by_id(user_id)
if user:
logger.info(f"找到用户 ID: {user_id}")
return {"user": user}
else:
logger.info(f"未找到用户 ID: {user_id}")
return {"message": "User not found"}
except Exception as e:
logger.error(f"获取用户时出错: {e}")
return {"message": "Error fetching user"}
8. API路由
创建API路由文件app/api/user_routes.py
和app/api/post_routes.py
,编写API路由。
python
# app/api/user_routes.py
from fastapi import APIRouter
router = APIRouter()
@router.get("/users/")
async def get_users():
return {"message": "List of users"}
@router.get("/users/{user_id}")
async def get_user(user_id: int):
return {"message": f"User with ID {user_id}"}
python
# app/api/post_routes.py
from fastapi import APIRouter
router = APIRouter()
@router.get("/posts/")
async def get_posts():
return {"message": "List of posts"}
@router.get("/posts/{post_id}")
async def get_post(post_id: int):
return {"message": f"Post with ID {post_id}"}
9. 主应用程序
创建主应用程序文件main.py
,包含启动和关闭事件,以及应用程序运行。
python
from fastapi import FastAPI
from app.api import user_router, post_router
from app.logger.logger import logger
from app.db.database import connect_to_db, close_db_connection
from app.cache.cache import create_redis_pool, close_redis_pool
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
# 包含 API 路由
app.include_router(user_router, prefix="/api/users")
app.include_router(post_router, prefix="/api/posts")
# 启用 CORS(跨源资源共享)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 允许所有来源
allow_credentials=True,
allow_methods=["*"], # 允许所有 HTTP 方法
allow_headers=["*"], # 允许所有 HTTP 头部
)
# 启动事件
@app.on_event("startup")
async def startup_event():
logger.info("连接数据库...")
app.state.db_connection = await connect_to_db()
logger.info("数据库连接成功.")
logger.info("创建 Redis 连接池...")
app.state.redis_pool = await create_redis_pool()
logger.info("Redis 连接池创建成功.")
# 关闭事件
@app.on_event("shutdown")
async def shutdown_event():
logger.info("关闭 Redis 连接池...")
await close_redis_pool(app.state.redis_pool)
logger.info("Redis 连接池关闭.")
logger.info("关闭数据库连接...")
await close_db_connection(app.state.db_connection)
logger.info("数据库连接关闭.")
if __name__ == "__main__":
import uvicorn
# 在所有 IP 地址上使用端口 8599 运行应用程序
uvicorn.run(app, host="0.0.0.0", port=8599)
10. 运行应用程序
运行main.py
文件,启动应用程序:
bash
python main.py
以上就是搭建整个项目的完整流程和代码。您可以根据需要进一步扩展和调整。