使用fastapi搭建一个python项目,链接数据库postgresql,链接redis缓存,使用日志框架打印日志

搭建整个项目的完整流程以及相关代码:

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.pyapp/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

以上就是搭建整个项目的完整流程和代码。您可以根据需要进一步扩展和调整。

相关推荐
尘浮生几秒前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
六月闻君14 分钟前
MySQL 报错:1137 - Can‘t reopen table
数据库·mysql
SelectDB技术团队23 分钟前
兼顾高性能与低成本,浅析 Apache Doris 异步物化视图原理及典型场景
大数据·数据库·数据仓库·数据分析·doris
inventecsh39 分钟前
mongodb基础操作
数据库·mongodb
白云如幻43 分钟前
SQL99版链接查询语法
数据库·sql·mysql
爱吃烤鸡翅的酸菜鱼1 小时前
MySQL初学之旅(4)表的设计
数据库·sql·mysql·database
The_Ticker2 小时前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
Elastic 中国社区官方博客2 小时前
Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
企鹅侠客2 小时前
ETCD调优
数据库·etcd
Json_181790144802 小时前
电商拍立淘按图搜索API接口系列,文档说明参考
前端·数据库