基于 Python 和 FastAPI 实现摸鱼倒计时界面
前言
在社交媒体上流传着一种有趣的'摸鱼人'倒计时模板,旨在提醒打工人劳逸结合。本文将介绍如何使用 Python 结合 FastAPI 框架,利用 Jinja2 模板引擎和农历转换库,快速搭建一个动态的摸鱼倒计时网页。
技术选型
- 后端框架: FastAPI (异步请求处理能力强,性能佳)
- 模板引擎: Jinja2 (用于动态渲染日期数据)
- 农历计算: zhdate (阳历与阴历转换)
- 部署: Nginx (可选,用于反向代理)
环境准备
安装必要的依赖包:
pip install fastapi uvicorn jinja2 zhdate
核心逻辑实现
除了静态文字外,当前日期、距离节日的天数等均为动态返回。我们需要重点处理时间的转换与计算。模板中包含阳历节日(如元旦、国庆)和阴历节日(如春节、端午)。使用 zhdate 库进行转换。
初始化 FastAPI 应用
import datetime
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from zhdate import ZhDate as lunar_date
app = FastAPI(
debug=False,
title="Slack Timer API",
docs_url="/docs",
openapi_url=f"/openapi.json"
)
templates = Jinja2Templates(directory="templates")
日期计算逻辑
计算距离春节、元旦的天数时,通常涉及跨年。对于其他节日,若已过当年日期,则需计算下一年的天数差。
def get_holiday_distance():
today = datetime.date.today()
# 春节(农历正月初一)通常在次年
distance_big_year = (lunar_date(today.year + 1, 1, 1).to_datetime().date() - today).days
# 端午节(农历五月初五)
distance_dragon_boat = (lunar_date(today.year, 5, 5).to_datetime().date() - today).days
distance_dragon_boat < :
distance_dragon_boat = (lunar_date(today.year + , , ).to_datetime().date() - today).days
distance_new_year = (datetime.date(today.year + , , ) - today).days
distance_national_day = (datetime.date(today.year, , ) - today).days
distance_national_day < :
distance_national_day = (datetime.date(today.year + , , ) - today).days
{
: today.strftime(),
: distance_big_year,
: distance_dragon_boat,
: distance_new_year,
: distance_national_day
}


