record.log.shortcut_views 源代码

import os

from django.http import HttpResponse

from utils.views import SecureView
from record.log.utils import get_logger
from record.log.config import log_config as CONFIG


[文档] class LogShortcut(SecureView): '''日志文件快捷呈现 显示日志文件列表,点击文件名可预览日志内容,GET参数控制末尾行数 由于安全性考虑,只有管理员可访问 ''' http_method_names = ['get']
[文档] def check_perm(self) -> None: super().check_perm() if not self.request.user.is_superuser: self.permission_denied()
[文档] def dispatch_prepare(self, method: str): match method: case 'get': return self.show_log if 'file' in self.request.GET else self.show_files case _: return self.default_prepare(method)
[文档] def logs(self) -> list[str]: return os.listdir(CONFIG.log_dir)
[文档] def display_log_list(self) -> str: log_list_html = '<ul>' for file in self.logs(): log_list_html += f'<li><a href="?file={file}">{file}</a></li>' log_list_html += '</ul>' return log_list_html
[文档] def show_files(self): return HttpResponse(f'<h1>Log Files</h1>' + self.display_log_list())
[文档] def show_log(self): file = self.request.GET.get('file', '') if file not in self.logs(): return self.permission_denied('Invalid log file selected.') try: num_lines = int(self.request.GET.get('lines', 100)) except ValueError: return self.permission_denied('Invalid number of lines selected.') with open(os.path.join(CONFIG.log_dir, file), 'r', encoding='utf8') as f: lines = f.readlines() content = ''.join(lines[-num_lines:]) preview = f'<pre>{content}</pre>' html_content = f'<h1>{file} 预览 (后{num_lines}行) </h1>' html_content += f'<h2><a href="?">返回</a></h2>' return HttpResponse(html_content + preview)
[文档] def get_logger(self): return super().get_logger() or get_logger('error')