大家好,我是吴老板。前言前段时间在微博上看到魔雨人的一个倒计时模板,挺有意思的。于是我花了一个小时写了一页,出来了摸鱼办公室的地址(当然是摸鱼的时间)。模板是这样的:摸鱼办公室🐟【摸鱼办公】今天是2021-11-30周二摸鱼人你好,工作再累也别忘了摸摸鱼!没事就起身到茶水间去楼顶走廊走走,不要一直坐在书桌上。多喝水,钱是老板的,命是自己的!🐟距离周末假期还有2天🐟元旦假期前3天🐟春节假期前34天🐟距离清明节假期还有97天……距离劳动节假期还有123天……距离端午节假期还有156天……距离中秋假期还有255天🐟距离国庆长假还有276天。由于前端是单页服务,所以直接贴一个原始的html页面就可以了。FastAPI适合异步请求,更轻量级,性能更好。加入一层Nginx使其看起来像那样。实现过程首先要知道,除了静态文本,比如当前日期,节假日前的天数等都是动态返回的,我需要使用Jinja2模板进行动态绑定。我应该专注于时间的处理。而且这个模板里面有公历的节日,也是农历的节日,我需要转换一下。初始化一个FastAPI对象,声明静态页面的模板目录(Jinja2Templates)#-*-coding:utf-8-*-importdatetimefromfastapiimportFastAPI,Requestfromfastapi.responsesimportHTMLResponsefromfastapi.templatingimportJinja2TemplatesfromzhdateimportZhDateaslunar_dateapp=FastAPI(debug=False="_API,t_docs",openf"/openapi.json")templates=Jinja2Templates(directory="templates")可以看到我使用了zhdate库,主要用于农历和阳历的相互转换。用法如下today=datetime.date.today()print(today.year,today.month,today.day)print("新年时间:",lunar_date(today.year+1,1,1)。to_datetime().date())print("端午节时间:",lunar_date(today.year,5,5).to_datetime().date())print("中秋节时间:",lunar_date(today.year,8,15).to_datetime().date())print("元旦时间:",f"{today.year+1}-01-01")print("清明时间:",f"{today.year}-04-05")print("工作时间:",f"{today.year}-05-01")print("国庆时间:",f"{today.year}-10-01")我们可以梳理一下:在计算元旦和元旦的天数时,需要在年份上加1。在计算与其他节日的天数时,需要判断天数差是否小于0,如果是,需要在年份上加1,因为过了的节日对这个distance_big_year=(lunar_date(today.year+1,1,1).to_datetime().date()-today).daysdistance_5_5=(lunar_date(today.year,5,5).to_datetime().date()-today).daysdistance_5_5=distance_5_5ifdistance_5_5>0else(lunar_date(today.year+1,5,5).to_datetime().date()-today).daysdistance_8_15=(lunar_date(today.year,8,15).to_datetime().date()-今天).daysdistance_8_15=distance_8_15ifdistance_8_15>0else(lunar_date(today.year+1,8,15).to_datetime().date()-today).daysdistance_year=(datetime.datetime.strptime(f"{today.year+1}-01-01","%Y-%m-%d").date()-today).daysdistance_4_5=(datetime.datetime.strptime(f"{today.year}-04-05","%Y-%m-%d").date()-today).daysdistance_4_5=distance_4_5ifdistance_4_5>0else(datetime.datetime.strptime(f"{today.year+1}-04-05","%Y-%m-%d").date()-today).daysdistance_5_1=(datetime.datetime.strptime(f"{today.year}-05-01","%Y-%m-%d").date()-today).daysdistance_5_1=distance_5_1ifdistance_5_1>0else(datetime.datetime.strptime(f"{today.year+1}-05-01","%Y-%m-%d").date()-today).daysdistance_10_1=(datetime.datetime.strptime(f"{today.year}-10-01","%Y-%m-%d").date()-today).daysdistance_10_1=distance_10_1ifdistance_10_1>0else(datetime.datetime.strptime(f"{今天.年份+1}-10-01","%Y-%m-%d").date()-today).days怎么样?我的命名已经够疯狂了。接下来,我需要计算从周末算起的天数。defget_week_day(日期):week_day_dict={0:'星期一',1:'星期二',2:'星期三',3:'星期四',4:'星期五',5:'星期六',6:'星期日',}day=date.weekday()returnweek_day_dict[day]week_day_=get_week_day(today)print(f"今天是:{week_day_}")#首先获取今天是星期几。按照每周5个工作日计算,今天离周末的天数是5-today.weekday()#today.weekday()今天离周末的距离现在集合所有数据time_=[{"v_":distance_year,"title":"元旦"},#距离元旦{"v_":distance_big_year,"title":"农历新年"},#Distance农历新年{"v_":distance_4_5,"title":"清明节"},#Distance清明{"v_":distance_5_1,"title":"劳动节"},#距离劳动{"v_":distance_5_5,"title":"端午"},#距离端午{"v_":distance_8_15,"title":"中自动mnFestival"},#Distance中秋节{"v_":distance_10_1,"title":"国庆"},#Distance国庆]至于为什么是List而不是Dict,就是需要按照离开的天数做一个排序,让第一个假期放在最前面,这样看起来会舒服很多。time_=sorted(time_,key=lambdax:x['v_'],reverse=False)接下来,编写一个路由将数据传递到html页面。@app.get("/",response_class=HTMLResponse)asyncdefreadme(request:Request):returntemplates.TemplateResponse("readme.html",{"request":request,"time_":time_,"now_":now_,"week_day_":week_day_})来看看一下完整的代码(main.py):#-*-coding:utf-8-*-importdatetimefromfastapiimportFastAPI,Requestfromfastapi.responsesimportHTMLResponsefromfastapi.templatingimportJinja2TemplatesfromzhdateimportZhDateaslunar_dateapp=FastAPI="debug,debug,docs_url=f"/docs",openapi_url=f"/openapi.json")templates=Jinja2Templates(directory="templates")today=datetime.date.today()#print(today.year,today.month,today.day)#print("大年时间:",lunar_date(today.year+1,1,1).to_datetime().date())#print("端午时间:",lunar_date(today.year,5,5).to_datetime().date())#print("中秋时间:",lunar_date(today.year,8,15).to_datetime().date())#print("元旦时间:",f"{今天.年+1}-01-01")#print("清明时间:",f"{today.year+1}-04-05")#print("劳动时间:",f"{today.year+1}-05-01")#print("庆典时间:",f"{today.year+1}-10-01")distance_big_year=(lunar_date(today.year+1,1,1).to_datetime().date()-today).daysdistance_5_5=(lunar_date(today.year,5,5).to_datetime().date()-today).daysdistance_5_5=distance_5_5ifdistance_5_5>0else(lunar_date(today.year+1,5,5).to_datetime().date()-today).daysdistance_8_15=(lunar_date(today.year,8,15).to_datetime().date()-today).daysdistance_8_15=distance_8_15ifdistance_8_15>0else(lunar_date(today.year+1,8,15).to_datetime().date()-today).daysdistance_year=(datetime.datetime.strptime(f"{today.year+1}-01-01","%Y-%m-%d").date()-today).daysdistance_4_5=(datetime.datetime.strptime(f"{today.year}-04-05","%Y-%m-%d").date()-today).daysdistance_4_5=distance_4_5ifdistance_4_5>0else(datetime.datetime.strptime(f"{today.year+1}-04-05","%Y-%m-%d").date()-today).daysdistance_5_1=(datetime.datetime.strptime(f"{today.year}-05-01""%Y-%m-%d").date()-today).daysdistance_5_1=distance_5_1ifdistance_5_1>0else(datetime.datetime.strptime(f"{today.year+1}-05-01","%Y-%m-%d").date()-today).daysdistance_10_1=(datetime.datetime.strptime(f"{today.year}-10-01","%Y-%m-%d")。date()-today).daysdistance_10_1=distance_10_1ifdistance_10_1>0else(datetime.datetime.strptime(f"{today.year+1}-10-01","%Y-%m-%d").date()-today).daysdefget_week_day(date):week_day_dict={0:'星期一',1:'星期二',2:'星期三',3:'星期四',4:'星期五',5:'星期六',6:'Sunday',}day=date.weekday()returnweek_day_dict[day]#print("距离新年的距离:",distance_big_year)#print("距离端午节的距离:",distance_5_5)#print("距离年中的距离中秋佳节:",distance_8_15)#print("距元旦距离:",distance_year)#print("距清明距离:",distance_4_5)#print("距劳动距离:",distance_5_1)#print("距离国庆:",distance_10_1)#print("距离周末:",5-today.weekday())now_=f"{today.year}year{today.month}month{today.day}day"week_day_=get_week_day(today)time_=[{"v_":5-1-today.weekday(),"title":"Weekend"},#从周末{"v_":distance_year,"title":"元旦"},#距离元旦{"v_":distance_big_year,"title":"新年"},#距离新年{"v_":distance_4_5,"title":"清明节"},#远方清明{"v_":distance_5_1,"title":"劳动节"},#远方劳动{"v_":distance_5_5,"title":"端午节"},#远方端午节{"v_":distance_8_15,"title":"中秋节"},#距离中秋节{"v_":distance_10_1,"title":"国庆节"},#距离国庆]time_=sorted(time_,key=lambdax:x['v_'],reverse=False)@app.get("/",response_class=HTMLResponse)asyncdefreadme(request:Request):returntemplates.TemplateResponse("readme.html",{"request":要求"time_":time_,"now_":now_,"week_day_":week_day_})if__name__=='__main__':importuvicornuvicorn.run(app='main:app',host="0.0.0.0",port=8080,reload=True)终于来到html页面部分了,来看看传递的主要值
{%forv_intime_%
🐟距离{{v_.title}}假期还有{{v_.v_}}天
{%else%}没有价值
{%endfor%}