完成项目信息管理的迁移
This commit is contained in:
@ -1,89 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
# @version : 1.0
|
||||
# @Create Time : 2022/3/21 11:03
|
||||
# @File : cache.py
|
||||
# @IDE : PyCharm
|
||||
# @desc : 缓存
|
||||
|
||||
from typing import List
|
||||
|
||||
from sqlalchemy import false
|
||||
from sqlalchemy.future import select
|
||||
from sqlalchemy.orm import joinedload
|
||||
from core.logger import logger # 注意:报错就在这里,如果只写 core.logger 会写入日志报错,很难排查
|
||||
from core.database import db_getter
|
||||
from apps.vadmin.system.models import VadminSystemSettingsTab
|
||||
import json
|
||||
from redis.asyncio.client import Redis
|
||||
from core.exception import CustomException
|
||||
from utils import status
|
||||
|
||||
|
||||
class Cache:
|
||||
|
||||
DEFAULT_TAB_NAMES = ["wx_server", "aliyun_sms", "aliyun_oss", "web_email"]
|
||||
|
||||
def __init__(self, rd: Redis):
|
||||
self.rd = rd
|
||||
|
||||
async def __get_tab_name_values(self, tab_names: List[str]):
|
||||
"""
|
||||
获取系统配置标签下的标签信息
|
||||
"""
|
||||
async_session = db_getter()
|
||||
session = await async_session.__anext__()
|
||||
model = VadminSystemSettingsTab
|
||||
v_options = [joinedload(model.settings)]
|
||||
sql = select(model).where(
|
||||
model.is_delete == false(),
|
||||
model.tab_name.in_(tab_names),
|
||||
model.disabled == false()
|
||||
).options(*[load for load in v_options])
|
||||
queryset = await session.execute(sql)
|
||||
datas = queryset.scalars().unique().all()
|
||||
return self.__generate_values(datas)
|
||||
|
||||
@classmethod
|
||||
def __generate_values(cls, datas: List[VadminSystemSettingsTab]):
|
||||
"""
|
||||
生成字典值
|
||||
"""
|
||||
return {
|
||||
tab.tab_name: {
|
||||
item.config_key: item.config_value
|
||||
for item in tab.settings
|
||||
if not item.disabled
|
||||
}
|
||||
for tab in datas
|
||||
}
|
||||
|
||||
async def cache_tab_names(self, tab_names: List[str] = None):
|
||||
"""
|
||||
缓存系统配置
|
||||
如果手动修改了mysql数据库中的配置
|
||||
那么需要在redis中将对应的tab_name删除
|
||||
"""
|
||||
|
||||
if not tab_names:
|
||||
tab_names = self.DEFAULT_TAB_NAMES
|
||||
datas = await self.__get_tab_name_values(tab_names)
|
||||
|
||||
for k, v in datas.items():
|
||||
await self.rd.client().set(k, json.dumps(v))
|
||||
|
||||
async def get_tab_name(self, tab_name: str, retry: int = 3):
|
||||
"""
|
||||
获取系统配置
|
||||
:param tab_name: 配置表标签名称
|
||||
:param retry: 重试次数
|
||||
"""
|
||||
result = await self.rd.get(tab_name)
|
||||
if not result and retry > 0:
|
||||
logger.error(f"未从Redis中获取到{tab_name}配置信息,正在重新更新配置信息,重试次数:{retry}。")
|
||||
await self.cache_tab_names([tab_name])
|
||||
return await self.get_tab_name(tab_name, retry - 1)
|
||||
elif not result and retry == 0:
|
||||
raise CustomException(f"获取{tab_name}配置信息失败,请联系管理员!", code=status.HTTP_ERROR)
|
||||
else:
|
||||
return json.loads(result)
|
59
utils/huawei_obs.py
Normal file
59
utils/huawei_obs.py
Normal file
@ -0,0 +1,59 @@
|
||||
from application.settings import HUAWEI_OBS
|
||||
|
||||
from obs import ObsClient
|
||||
from obs import DeleteObjectsRequest
|
||||
from obs import Object
|
||||
|
||||
|
||||
class ObsClient:
|
||||
|
||||
def __int__(self):
|
||||
self.obsClient = ObsClient(
|
||||
access_key_id=HUAWEI_OBS['AccessKeyID'],
|
||||
secret_access_key=HUAWEI_OBS['SecretAccessKey'],
|
||||
server=HUAWEI_OBS["server"])
|
||||
|
||||
async def put_file(self, objectKey: str, file_path: str):
|
||||
resp = await self.obsClient.putFile(
|
||||
bucketName=HUAWEI_OBS["bucketName"],
|
||||
objectKey=objectKey,
|
||||
file_path=file_path)
|
||||
if resp.status < 300:
|
||||
print("objectKey", objectKey)
|
||||
print("url", resp.body.objectUrl)
|
||||
return True, objectKey, resp.body.objectUrl
|
||||
else:
|
||||
return False, None, None
|
||||
|
||||
async def put_object(self, objectKey: str, file_content):
|
||||
resp = await self.obsClient.put_object(
|
||||
bucketName=HUAWEI_OBS["bucketName"],
|
||||
objectKey=objectKey,
|
||||
file_cotent=file_content)
|
||||
if resp.status < 300:
|
||||
print("objectKey", objectKey)
|
||||
print("url", resp.body.objectUrl)
|
||||
return True, objectKey, resp.body.objectUrl
|
||||
else:
|
||||
return False, None, None
|
||||
|
||||
async def del_objects(self, object_keys: []):
|
||||
objects = []
|
||||
for object_key in object_keys:
|
||||
object_one = Object(key=object_key, versionId=None)
|
||||
objects.append(object_one)
|
||||
encoding_type = 'url'
|
||||
|
||||
resp = await self.obsClient.deleteObjects(
|
||||
bucketName=HUAWEI_OBS["bucketName"],
|
||||
deleteObjectsRequest=DeleteObjectsRequest(quiet=False, objects=objects, encoding_type=encoding_type))
|
||||
if resp.status < 300:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
async def close(self):
|
||||
await self.obsClient.close()
|
||||
|
||||
|
@ -15,7 +15,6 @@ from typing import List
|
||||
from redis.asyncio import Redis
|
||||
|
||||
from core.exception import CustomException
|
||||
from utils.cache import Cache
|
||||
|
||||
|
||||
class EmailSender:
|
||||
@ -32,7 +31,7 @@ class EmailSender:
|
||||
"""
|
||||
获取配置信息
|
||||
"""
|
||||
web_email = await Cache(self.rd).get_tab_name("web_email", retry)
|
||||
web_email = []
|
||||
self.email = web_email.get("email_access")
|
||||
self.password = web_email.get("email_password")
|
||||
self.smtp_server = web_email.get("email_server")
|
||||
@ -84,10 +83,3 @@ class EmailSender:
|
||||
print('邮件发送失败!错误信息:', e)
|
||||
return False
|
||||
|
||||
|
||||
# if __name__ == '__main__':
|
||||
# sender = EmailSender()
|
||||
# to_emails = ['ktianc2001@163.com', '2445667550@qq.com']
|
||||
# subject = 'Test email'
|
||||
# body = 'This is a test email'
|
||||
# sender.send_email(to_emails, subject, body)
|
||||
|
@ -28,7 +28,6 @@ from alibabacloud_tea_util import models as util_models
|
||||
from core.logger import logger
|
||||
import datetime
|
||||
from redis.asyncio.client import Redis
|
||||
from utils.cache import Cache
|
||||
from utils.db_getter import DBGetter
|
||||
|
||||
|
||||
@ -86,7 +85,7 @@ class AliyunSMS(DBGetter):
|
||||
raise ValueError("缺少 redis 对象参数!")
|
||||
elif not self.sign_conf or not self.template_code_conf:
|
||||
raise ValueError("缺少短信签名信息和短信模板ID!")
|
||||
aliyun_sms = await Cache(self.rd).get_tab_name("aliyun_sms", retry)
|
||||
aliyun_sms = []
|
||||
self.access_key = aliyun_sms.get("sms_access_key")
|
||||
self.access_key_secret = aliyun_sms.get("sms_access_key_secret")
|
||||
self.send_interval = int(aliyun_sms.get("sms_send_interval"))
|
||||
|
@ -8,7 +8,6 @@
|
||||
|
||||
import requests
|
||||
from core.logger import logger
|
||||
from utils.cache import Cache
|
||||
from utils.wx.wx_access_token import WxAccessToken
|
||||
from redis.asyncio import Redis
|
||||
|
||||
@ -35,7 +34,7 @@ class WXOAuth:
|
||||
"""
|
||||
if not self.tab_name:
|
||||
logger.error(f"请选择认证的微信平台")
|
||||
wx_config = await Cache(self.rd).get_tab_name(self.tab_name, retry)
|
||||
wx_config = []
|
||||
self.appid = wx_config.get("wx_server_app_id")
|
||||
self.secret = wx_config.get("wx_server_app_secret")
|
||||
|
||||
|
Reference in New Issue
Block a user