LogDisplayer / utils.py
Beracles's picture
优化日志管理,支持最近30天的日志加载和日期范围验证功能
1c7b6d3
raw
history blame
3.12 kB
from datetime import datetime
from zoneinfo import ZoneInfo
from typing import Any
from jose import jwt
import hashlib
import json
import uuid
import os
SECRET_KEY = os.environ.get("SECRET_KEY")
def beijing():
"""get beijing time"""
return datetime.now(tz=ZoneInfo("Asia/Shanghai"))
def decode_jwt(token: str) -> dict[str, Any]:
"""get payload in the jwt token"""
assert SECRET_KEY, "Please set the environment variable SECRET_KEY"
return jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
def parse_token(token: str | None) -> tuple[str, str]:
"""parse user token to get uid and username
:param token (str): jwt token
:return (str, str): (uid, username)
"""
if not token:
uid, username = "no_uid", "Anonymous"
else:
payload: dict = decode_jwt(token)
uid = payload.get("uid", "no_uid")
username = payload.get("username", "Anonymous")
print(f"UID: {uid}")
print(f"Username: {username}")
return uid, username
def md5(text: list[str | bytes] | str | bytes | None = None) -> str:
"""generate the md5 hash code of the given text, if text is None,
return a random md5"""
code = hashlib.md5()
if text:
if isinstance(text, str):
text = text.encode("utf-8")
code.update(text)
elif isinstance(text, list):
for t in text:
if isinstance(t, str):
t = t.encode("utf-8")
code.update(t)
else:
code.update(text)
else:
code.update(uuid.uuid4().bytes)
return code.hexdigest()
def json_to_str(obj: dict | list) -> str:
return json.dumps(obj, separators=(",", ":"))
def validate_date_format(date_str: str, format_str: str = "%Y-%m-%d") -> bool:
"""
验证日期字符串的格式是否正确
:param date_str: 要验证的日期字符串
:param format_str: 期望的日期格式(默认:YYYY-MM-DD)
:return: 如果格式正确返回 True,否则返回 False
"""
if not date_str:
return True # 空值被认为是有效的(可选参数)
try:
from datetime import datetime as dt
dt.strptime(date_str, format_str)
return True
except ValueError:
return False
def parse_date_range(from_date: str | None, to_date: str | None) -> tuple[str | None, str | None] | tuple[str, str]:
"""
解析和验证日期范围
:param from_date: 开始日期(格式:YYYY-MM-DD)
:param to_date: 结束日期(格式:YYYY-MM-DD)
:return: 验证后的日期范围元组 (from_date, to_date)
:raises ValueError: 如果日期格式不正确或范围无效
"""
if from_date and not validate_date_format(from_date):
raise ValueError(f"Invalid from_date format: {from_date}")
if to_date and not validate_date_format(to_date):
raise ValueError(f"Invalid to_date format: {to_date}")
if from_date and to_date and from_date > to_date:
raise ValueError(f"from_date ({from_date}) cannot be after to_date ({to_date})")
return from_date, to_date