97 lines
2.9 KiB
Python
97 lines
2.9 KiB
Python
from io import BytesIO
|
|
from flask import make_response
|
|
from flask_login import current_user
|
|
|
|
from applications.common.utils.validate import str_escape
|
|
from applications.common.utils.captcha import vieCode
|
|
from applications.extensions import db
|
|
from applications.models import AdminLog
|
|
|
|
|
|
def get_captcha():
|
|
"""
|
|
生成验证码图片及其对应的验证码字符串。
|
|
|
|
:return: 返回验证码图片的响应对象和验证码字符串。
|
|
"""
|
|
image, code = vieCode().GetCodeImage()
|
|
code = ''.join(code).lower()
|
|
out = BytesIO()
|
|
image.save(out, 'png')
|
|
out.seek(0)
|
|
resp = make_response(out.read())
|
|
resp.content_type = 'image/png'
|
|
return resp, code
|
|
|
|
|
|
def normal_log(method, url, ip, user_agent, desc, uid, is_access):
|
|
"""
|
|
记录通用日志信息到数据库。
|
|
|
|
:param method: 请求方法(如 GET、POST)。
|
|
:param url: 请求的 URL。
|
|
:param ip: 客户端的 IP 地址。
|
|
:param user_agent: 客户端的 User-Agent 信息。
|
|
:param desc: 日志描述信息。
|
|
:param uid: 用户 ID。
|
|
:param is_access: 是否成功访问(True 或 False)。
|
|
:return: 返回日志记录的 ID。
|
|
"""
|
|
info = {
|
|
'method': method,
|
|
'url': url,
|
|
'ip': ip,
|
|
'user_agent': user_agent,
|
|
'desc': desc,
|
|
'uid': uid,
|
|
'success': int(is_access)
|
|
}
|
|
log = AdminLog(
|
|
url=info.get('url'),
|
|
ip=info.get('ip'),
|
|
user_agent=info.get('user_agent'),
|
|
desc=info.get('desc'),
|
|
uid=info.get('uid'),
|
|
method=info.get('method'),
|
|
success=info.get('success')
|
|
)
|
|
db.session.add(log)
|
|
db.session.commit()
|
|
return log.id
|
|
|
|
|
|
def login_log(request, uid, is_access):
|
|
"""
|
|
记录用户登录日志。
|
|
|
|
:param request: Flask 请求对象。
|
|
:param uid: 用户 ID。
|
|
:param is_access: 是否成功登录(True 或 False)。
|
|
:return: 返回日志记录的 ID。
|
|
"""
|
|
method = request.method
|
|
url = request.path
|
|
ip = request.remote_addr
|
|
user_agent = str_escape(request.headers.get('User-Agent'))
|
|
desc = str_escape(request.form.get('username'))
|
|
return normal_log(method, url, ip, user_agent, desc, uid, is_access)
|
|
|
|
|
|
def admin_log(request, is_access, desc=None):
|
|
"""
|
|
记录管理员操作日志。
|
|
|
|
:param request: Flask 请求对象。
|
|
:param is_access: 是否成功操作(True 或 False)。
|
|
:param desc: 日志描述信息(可选)。如果未提供,则从请求数据中提取。
|
|
:return: 返回日志记录的 ID。
|
|
"""
|
|
method = request.method
|
|
url = request.path
|
|
ip = request.remote_addr
|
|
user_agent = str_escape(request.headers.get('User-Agent'))
|
|
request_data = request.json if request.headers.get('Content-Type') == 'application/json' else request.values
|
|
if desc is None:
|
|
desc = str_escape(str(dict(request_data)))
|
|
return normal_log(method, url, ip, user_agent, desc, current_user.id, is_access)
|