LogDisplayer / utils.py
Beracles's picture
优化日志管理,支持最近30天的日志加载和日期范围验证功能
1c7b6d3
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