<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          手把手教你使用Python打造一款摸魚(yú)倒計(jì)界面

          共 14695字,需瀏覽 30分鐘

           ·

          2024-08-03 10:00

          點(diǎn)擊上方“Python爬蟲(chóng)與數(shù)據(jù)挖掘”,進(jìn)行關(guān)注

          回復(fù)“書(shū)籍”即可獲贈(zèng)Python從入門(mén)到進(jìn)階共10本電子書(shū)

          可憐夜半虛前席,不問(wèn)蒼生問(wèn)鬼神。

          大家好,我是吳老板。

          前言

          前段時(shí)間在微博看到一段摸魚(yú)人的倒計(jì)時(shí)模板,感覺(jué)還挺有趣的。


          于是我用了一小時(shí)的時(shí)間寫(xiě)了個(gè)頁(yè)面出來(lái) 摸魚(yú)辦地址 (當(dāng)然是摸魚(yú)的時(shí)間啦)。

          模板是這樣的:

          摸魚(yú)辦公室 ??

          【摸魚(yú)辦公室】今天是 2021-11-30 星期二

          你好,摸魚(yú)人,工作再累,一定不要忘記摸魚(yú)哦 ! 有事沒(méi)事起身去茶水間去廊道去天臺(tái)走走,別老在工位上坐著。多喝點(diǎn)水,錢(qián)是老板的,但命是自己的 !

          ?? 距離 周末 放假還有 2 天

          ?? 距離 元旦 放假還有 3 天

          ?? 距離 過(guò)年 放假還有 34 天

          ?? 距離 清明節(jié) 放假還有 97 天

          ?? 距離 勞動(dòng)節(jié) 放假還有 123 天

          ?? 距離 端午節(jié) 放假還有 156 天

          ?? 距離 中秋節(jié) 放假還有 255 天

          ?? 距離 國(guó)慶節(jié) 放假還有 276 天


          • 由于前端是單頁(yè)面服務(wù),直接擼一個(gè)原始的 html 網(wǎng)頁(yè)就行。
          • FastAPI 對(duì)于異步請(qǐng)求是一把好手、更輕、性能更佳。
          • 掛上一層 Nginx 讓它看起來(lái)像那么回事兒。

          實(shí)現(xiàn)過(guò)程

          • 首先要知道、除了靜態(tài)文字之外的比如當(dāng)前日期、距離節(jié)日放假的天數(shù)等都是動(dòng)態(tài)返回的,我需要使用 Jinja2 模板進(jìn)行動(dòng)態(tài)綁定。
          • 我應(yīng)該把重點(diǎn)放在時(shí)間的處理上。
          • 而且在這個(gè)模板中,有陽(yáng)歷的節(jié)日,也是陰歷的節(jié)日,我需要轉(zhuǎn)換。

          初始化一個(gè) FastAPI 對(duì)象并聲明靜態(tài)頁(yè)面的模板目錄 (Jinja2Templates)

          # -*- coding: utf-8 -*-
          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="My API",
              docs_url="/docs",
              openapi_url=f"/openapi.json"
          )

          templates = Jinja2Templates(directory="templates")

          可以看到的是我用到了 zhdate 這個(gè)庫(kù)、主要用于陰歷陽(yáng)歷之間的相互轉(zhuǎn)換。用法如下

          today = datetime.date.today()
          print(today.year, today.month, today.day)
          print("大年時(shí)間: ", lunar_date(today.year+111).to_datetime().date())
          print("端午時(shí)間: ", lunar_date(today.year, 55).to_datetime().date())
          print("中秋時(shí)間: ", lunar_date(today.year, 815).to_datetime().date())
          print("元旦時(shí)間: "f"{today.year+1}-01-01")
          print("清明時(shí)間: "f"{today.year}-04-05")
          print("勞動(dòng)時(shí)間: "f"{today.year}-05-01")
          print("國(guó)慶時(shí)間: "f"{today.year}-10-01")

          我們可以梳理一下:

          • 計(jì)算距離 大年、元旦 的天數(shù)時(shí),要在年份上 +1
          • 計(jì)算距離 其他節(jié)日 的天數(shù)時(shí),要判斷天數(shù)差是否小于 0,如果是,則年份需要 +1,因?yàn)橐呀?jīng)過(guò)去的節(jié)日對(duì)此沒(méi)有意義
          distance_big_year = (lunar_date(today.year + 111).to_datetime().date() - today).days

          distance_5_5 = (lunar_date(today.year, 55).to_datetime().date() - today).days
          distance_5_5 = distance_5_5 if distance_5_5 > 0 else (
                  lunar_date(today.year + 155).to_datetime().date() - today).days

          distance_8_15 = (lunar_date(today.year, 815).to_datetime().date() - today).days
          distance_8_15 = distance_8_15 if distance_8_15 > 0 else (
                  lunar_date(today.year + 1815).to_datetime().date() - today).days

          distance_year = (datetime.datetime.strptime(f"{today.year + 1}-01-01""%Y-%m-%d").date() - today).days

          distance_4_5 = (datetime.datetime.strptime(f"{today.year}-04-05""%Y-%m-%d").date() - today).days
          distance_4_5 = distance_4_5 if distance_4_5 > 0 else (
                  datetime.datetime.strptime(f"{today.year + 1}-04-05""%Y-%m-%d").date() - today).days

          distance_5_1 = (datetime.datetime.strptime(f"{today.year}-05-01""%Y-%m-%d").date() - today).days
          distance_5_1 = distance_5_1 if distance_5_1 > 0 else (
                  datetime.datetime.strptime(f"{today.year + 1}-05-01""%Y-%m-%d").date() - today).days

          distance_10_1 = (datetime.datetime.strptime(f"{today.year}-10-01""%Y-%m-%d").date() - today).days
          distance_10_1 = distance_10_1 if distance_10_1 > 0 else (
                  datetime.datetime.strptime(f"{today.year + 1}-10-01""%Y-%m-%d").date() - today).days

          怎么樣? 我的命名足夠瘋狂吧。

          接下來(lái)需要計(jì)算一下距離周末的天數(shù)。

          def get_week_day(date):
              week_day_dict = {
                  0'星期一',
                  1'星期二',
                  2'星期三',
                  3'星期四',
                  4'星期五',
                  5'星期六',
                  6'星期天',
              }
              day = date.weekday()
              return week_day_dict[day]

          week_day_ = get_week_day(today)
          print(f"今天是: {week_day_}"# 先獲取今天是星期幾

          按照每周 5 個(gè)工作日計(jì)算,今天距離周末的天數(shù)就是

          5 - today.weekday() # today.weekday() 今天距離周末

          現(xiàn)在將所有的數(shù)據(jù)組裝起來(lái)

          time_ = [
              {"v_": distance_year, "title""元旦"},  # 距離元旦
              {"v_": distance_big_year, "title""過(guò)年"},  # 距離過(guò)年
              {"v_": distance_4_5, "title""清明節(jié)"},  # 距離清明
              {"v_": distance_5_1, "title""勞動(dòng)節(jié)"},  # 距離勞動(dòng)
              {"v_": distance_5_5, "title""端午節(jié)"},  # 距離端午
              {"v_": distance_8_15, "title""中秋節(jié)"},  # 距離中秋
              {"v_": distance_10_1, "title""國(guó)慶節(jié)"},  # 距離國(guó)慶
          ]

          至于為什么是 List 而不是 Dict,那是我需要做一個(gè)根據(jù)距離天數(shù)的排序,讓最先放假的節(jié)日放于最前面, 這樣看起來(lái)會(huì)舒服得多。

          time_ = sorted(time_, key=lambda x: x['v_'], reverse=False)

          接下來(lái)要寫(xiě)一個(gè) 路由,將數(shù)據(jù)傳入到 html 頁(yè)面中去。

          @app.get("/", response_class=HTMLResponse)
          async def readme(request: Request):
              return templates.TemplateResponse("readme.html",
                                                {"request": request, "time_": time_, "now_": now_, "week_day_": week_day_})

          來(lái)看一下完整的代碼 (main.py):

          # -*- coding: utf-8 -*-
          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="My API",
              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("大年時(shí)間: ", lunar_date(today.year+1, 1, 1).to_datetime().date())
          # print("端午時(shí)間: ", lunar_date(today.year, 5, 5).to_datetime().date())
          # print("中秋時(shí)間: ", lunar_date(today.year, 8, 15).to_datetime().date())
          # print("元旦時(shí)間: ", f"{today.year+1}-01-01")
          # print("清明時(shí)間: ", f"{today.year+1}-04-05")
          # print("勞動(dòng)時(shí)間: ", f"{today.year+1}-05-01")
          # print("國(guó)慶時(shí)間: ", f"{today.year+1}-10-01")

          distance_big_year = (lunar_date(today.year + 111).to_datetime().date() - today).days

          distance_5_5 = (lunar_date(today.year, 55).to_datetime().date() - today).days
          distance_5_5 = distance_5_5 if distance_5_5 > 0 else (
                  lunar_date(today.year + 155).to_datetime().date() - today).days

          distance_8_15 = (lunar_date(today.year, 815).to_datetime().date() - today).days
          distance_8_15 = distance_8_15 if distance_8_15 > 0 else (
                  lunar_date(today.year + 1815).to_datetime().date() - today).days

          distance_year = (datetime.datetime.strptime(f"{today.year + 1}-01-01""%Y-%m-%d").date() - today).days

          distance_4_5 = (datetime.datetime.strptime(f"{today.year}-04-05""%Y-%m-%d").date() - today).days
          distance_4_5 = distance_4_5 if distance_4_5 > 0 else (
                  datetime.datetime.strptime(f"{today.year + 1}-04-05""%Y-%m-%d").date() - today).days

          distance_5_1 = (datetime.datetime.strptime(f"{today.year}-05-01""%Y-%m-%d").date() - today).days
          distance_5_1 = distance_5_1 if distance_5_1 > 0 else (
                  datetime.datetime.strptime(f"{today.year + 1}-05-01""%Y-%m-%d").date() - today).days

          distance_10_1 = (datetime.datetime.strptime(f"{today.year}-10-01""%Y-%m-%d").date() - today).days
          distance_10_1 = distance_10_1 if distance_10_1 > 0 else (
                  datetime.datetime.strptime(f"{today.year + 1}-10-01""%Y-%m-%d").date() - today).days


          def get_week_day(date):
              week_day_dict = {
                  0'星期一',
                  1'星期二',
                  2'星期三',
                  3'星期四',
                  4'星期五',
                  5'星期六',
                  6'星期天',
              }
              day = date.weekday()
              return week_day_dict[day]


          # print("距離大年: ", distance_big_year)
          # print("距離端午: ", distance_5_5)
          # print("距離中秋: ", distance_8_15)
          # print("距離元旦: ", distance_year)
          # print("距離清明: ", distance_4_5)
          # print("距離勞動(dòng): ", distance_5_1)
          # print("距離國(guó)慶: ", distance_10_1)
          # print("距離周末: ", 5 - today.weekday())

          now_ = f"{today.year}{today.month}{today.day}日"
          week_day_ = get_week_day(today)
          time_ = [
              {"v_"5 - 1 - today.weekday(), "title""周末"},  # 距離周末
              {"v_": distance_year, "title""元旦"},  # 距離元旦
              {"v_": distance_big_year, "title""過(guò)年"},  # 距離過(guò)年
              {"v_": distance_4_5, "title""清明節(jié)"},  # 距離清明
              {"v_": distance_5_1, "title""勞動(dòng)節(jié)"},  # 距離勞動(dòng)
              {"v_": distance_5_5, "title""端午節(jié)"},  # 距離端午
              {"v_": distance_8_15, "title""中秋節(jié)"},  # 距離中秋
              {"v_": distance_10_1, "title""國(guó)慶節(jié)"},  # 距離國(guó)慶
          ]

          time_ = sorted(time_, key=lambda x: x['v_'], reverse=False)


          @app.get("/", response_class=HTMLResponse)
          async def readme(request: Request):
              return templates.TemplateResponse("readme.html",
                                                {"request": request, "time_": time_, "now_": now_, "week_day_": week_day_})


          if __name__ == '__main__':
              import uvicorn

              uvicorn.run(app='main:app', host="0.0.0.0", port=8080, reload=True)

          最后就到了 html 頁(yè)面部分了,來(lái)看一下主要的傳值。

          <center>
              【摸魚(yú)辦公室】今天是 {{ now_ }} {{ week_day_ }}
              <br><br>
              {% for v_ in time_ %}
                  <p>?? 距離 {{ v_.title }} 放假還有 {{ v_.v_ }} 天</p>
              {% else %}
                  <p>沒(méi)有任何值</p>
              {% endfor %}

          </center>

          這樣整個(gè)的路由構(gòu)造和頁(yè)面編寫(xiě)就算是完成了。

          最后通過(guò) Nginx 部署到我的站點(diǎn)上。

          摸魚(yú)辦預(yù)覽地址

          代碼已經(jīng)上傳至 摸魚(yú)辦

          https://github.com/PY-GZKY/moyu

          你可能會(huì)有更多的想法、可以在評(píng)論區(qū)討論、一切為了摸魚(yú)。

          小伙伴們,快快用實(shí)踐一下吧!如果在學(xué)習(xí)過(guò)程中,有遇到任何問(wèn)題,歡迎加我好友,我拉你進(jìn)Python學(xué)習(xí)交流群共同探討學(xué)習(xí)。

          ------------------- End -------------------

          往期精彩文章推薦:

          歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群

          萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行

          /今日留言主題/

          隨便說(shuō)一兩句吧~~

          瀏覽 46
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青娱乐社区精品自拍视频 | 色婷婷亚洲精品天天 | 欧美精品18| 亚洲无码AV在线亚洲有码AV在线精品 | 91成人在线影院 |