久久亚洲中文字幕不卡一二区,久久亚洲精品中文字幕无码,精品日本一区二区三区在线观看,久久国产午夜精品理论片,久久强奷乱码老熟女网站

位置 歡迎訪問武漢興悅達助力財稅服務有限公司,我們將提供代理記賬/公司注冊/稅務代理等服務!

聯(lián)系電話

全國免費咨詢熱線:

17798222886
財稅資訊
當前位置:新聞中心 > 記賬代理 > 稅務局電子發(fā)票接口api

快捷服務入口

最新文章

記賬代理稅務局電子發(fā)票接口api

編輯:興悅達助力財稅時間:2024-03-11 0

用一系列文章介紹如何用python寫一個發(fā)票管理小工具。

本文介紹如何用Uvicorn+FastAPI搭建后臺接口,如何使用loguru打印日志,以及自動打開瀏覽器顯示前端頁面。

代碼結構

基本思路

大家一般運行Uvicorn都是uvicorn.run()直接運行,這樣uvicorn啟動后會阻塞程序,后續(xù)無法執(zhí)行代碼。

所以這里我們使用Python多進程,一個主進程用于打開瀏覽器以及后續(xù)其他功能,一個獨立的子進程運行Uvicorn。

配置文件

創(chuàng)建一個配置文件config.yml,編寫config.py用于讀取配置文件。使用ruamel.yaml模塊讀取yaml文件。

#config.pyfrom ruamel.yaml import YAMLclass AppConfig():def __init__(self):with open("config/config.yml","r",encoding="utf-8") as configFile:yaml = YAML()conf = yaml.load(configFile)self.config = confself.loguru = self.config['loguru']self.uvicorn = self.config['uvicorn']appConfig = AppConfig()
# config.yml# 日志配置loguru:format: '{time:YYYY-MM-DDTHH:mm:ss.SSSZ} {level} tid[{extra[tid]}] {message}'level: DEBUGfile: logs/application.logrotation: 00:00retention: 30 days# uvicorn設置uvicorn:host: 127.0.0.1port: 8088# 等待web服務啟動時間,服務啟動后自動打開瀏覽器waitWebServerTime: 10

獨立進程運行Uvicorn

使用multiprocessing.Process創(chuàng)建子進程,注意設置daemon=True,這樣主進程關閉時會自動關掉子進程。

import uvicornfrom multiprocessing import Processfrom config import appConfigdef runUvicorn():uvicorn.run("webapi:app", host=appConfig.uvicorn["host"], port=appConfig.uvicorn["port"], reload=False, log_config='config/uvicornLog.json', access_log=True, workers=1)# 啟動web服務webapiProcess = Process(target=runUvicorn, name="webapi_process", daemon=True)webapiProcess.start()try:while True:time.sleep(1)except KeyboardInterrupt: logger.info("user interrupt, close application")sys.exit(0)

日志增加TID

為了方便日志追蹤,一般我們都會在日志中打印一個transaction_id,用戶一個請求過程中的所有日志都有這樣一個唯一的transaction_id。

我們使用loguru模塊來打印日志,loguru配置和使用非常簡單,而且我們的程序使用了多進程,loguru是支持多進程的。

第一節(jié)的配置文件中已經有l(wèi)oguru需要的配置項了,下面介紹如何使用loguru,以及fastapi如何生成transaction_id,并且將tid添加到日志中。

創(chuàng)建log.py

from loguru import loggerimport sysfrom config import appConfiglogger.remove()logger.configure(extra={"tid":""})logger.add(sys.stderr,enqueue=True, format=appConfig.loguru["format"], level=appConfig.loguru["level"])logger.add(appConfig.loguru["file"], enqueue=True, format=appConfig.loguru["format"], level=appConfig.loguru["level"], rotation=appConfig.loguru["rotation"], retention=appConfig.loguru["retention"])

需要關注的是logger.configure(extra={"tid":""})這一行,將tid添加到日志record的extra中,extra是loguru提供給用戶添加自定義日志字段的屬性。雖然也有辦法直接修改record,但是建議添加到extra中。

在webapi.py中添加middleware,在收到請求時生成tid。然后通過loguru的pach將tid添加到日志record中。

#webapi.pyfrom random import randintfrom typing import Callable, Optionalfrom fastapi import FastAPI,Requestfrom loguru import loggerfrom datetime import datetimefrom contextvars import ContextVar# 用于日志記錄當前請求IDtransaction_id: ContextVar[Optional[str]] = ContextVar('transaction_id', default='')def transaction_id_filter(record):record['extra']['tid'] = transaction_id.get()return record# 此處向日志中設置tidlogger.configure(patcher=transaction_id_filter)app = FastAPI(title='My Invoice Folder', docs_url=None, redoc_url=None)# 生成請求ID@app.middleware("http")async def create_transaction_id(request: Request, call_next: Callable):# tid格式為時間戳+4位隨機數(shù)transaction_id.set(f"{datetime.now().strftime('%Y%m%d%H%M%S%f')[:-3]}{randint(1000, 9999)}")response = await call_next(request)return response

將fastapi首頁設置為發(fā)票夾頁面

我們之前已經寫了一個發(fā)票夾html頁面,這里直接將fastapi首頁跳轉到這個頁面就可以了。

將頁面資源都放到項目ui文件夾中,加載ui文件夾。

app.mount("/ui", StaticFiles(directory="ui"), name="ui")

設置首頁跳轉

# 首頁跳轉到我的發(fā)票夾頁面@app.get("/", include_in_schema=False)def read_root():logger.info("access index page")return RedirectResponse("/ui/index.html")

自動打開瀏覽器顯示發(fā)票夾頁面

首先我們在啟動Uvicorn進程后,使用request請求首頁,如果請求成功,則打開系統(tǒng)默認瀏覽器并打開發(fā)票夾首頁。代碼如下:

# 啟動系統(tǒng)默認瀏覽器打開界面waitWebServerTime = appConfig.config["waitWebServerTime"]openBrowserSuccess = Falsewhile waitWebServerTime > 0:time.sleep(1)try: # 判斷web服務是否已啟動indexUrl = f'http://{appConfig.uvicorn["host"]}:{appConfig.uvicorn["port"]}/'response = requests.get(indexUrl, timeout=1)if response.status_code == 200:# 打開主頁openBrowserSuccess = openBrowser(indexUrl)breakexcept Exception as e:passwaitWebServerTime -= 1

總結

現(xiàn)在我們可以直接運行main.py,就可以運行后端api,并且自動打開瀏覽器看到頁面了~后續(xù)邏輯抽空繼續(xù)寫。

控制臺日志

自動打開瀏覽器,訪問本地頁面

代碼比較多,已經上傳到github(


 *本站所有相關知識僅供大家參考、學習之用,部分來源于互聯(lián)網,其版權均歸原作者及網站所有,如無意侵犯您的權利,請與小編聯(lián)系,我們將會在第一時間核實,如情況屬實會在3個工作日內刪除


極速咨詢通道(客服1分鐘內響應)