53 lines
1.3 KiB
Python
53 lines
1.3 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
from __future__ import annotations
|
|
|
|
import html
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
import pytz
|
|
|
|
# ==================== 时区处理工具函数 ====================
|
|
|
|
CST_TZ = pytz.timezone("Asia/Shanghai")
|
|
|
|
|
|
def get_cst_now() -> datetime:
|
|
return datetime.now(CST_TZ)
|
|
|
|
|
|
def get_cst_now_str() -> str:
|
|
return get_cst_now().strftime("%Y-%m-%d %H:%M:%S")
|
|
|
|
|
|
def parse_cst_datetime(datetime_str: str) -> datetime:
|
|
naive = datetime.strptime(datetime_str, "%Y-%m-%d %H:%M:%S")
|
|
return CST_TZ.localize(naive)
|
|
|
|
|
|
# ==================== 安全工具(与 app_security 保持兼容) ====================
|
|
|
|
|
|
def escape_html(text: Optional[object]) -> str:
|
|
try:
|
|
from app_security import escape_html as _escape_html
|
|
|
|
return _escape_html(text)
|
|
except Exception:
|
|
if text is None:
|
|
return ""
|
|
return html.escape(str(text))
|
|
|
|
|
|
def sanitize_sql_like_pattern(pattern: Optional[object]) -> str:
|
|
try:
|
|
from app_security import sanitize_sql_like_pattern as _sanitize_sql_like_pattern
|
|
|
|
return _sanitize_sql_like_pattern(pattern)
|
|
except Exception:
|
|
if pattern is None:
|
|
return ""
|
|
return str(pattern).replace("\\", "\\\\").replace("%", "\\%").replace("_", "\\_")
|
|
|