feat: 修改系统自定义配置文件

This commit is contained in:
caoqianming 2023-06-09 09:41:18 +08:00
parent f452b43016
commit 52bb1ca367
6 changed files with 78 additions and 46 deletions

View File

@ -41,7 +41,7 @@ from rest_framework.viewsets import GenericViewSet
from cron_descriptor import get_description
import locale
from drf_yasg.utils import swagger_auto_schema
from server.settings import SYSCONF, SYS_JSON_PATH
from server.settings import get_sysconfig, update_sysconfig
# logger.info('请求成功! response_code:{}response_headers:{}
# response_body:{}'.format(response_code, response_headers, response_body[:251]))
@ -653,7 +653,8 @@ class ApkViewSet(MyLoggingMixin, ListModelMixin, CreateModelMixin, GenericViewSe
获取apk信息
"""
return Response({'version': SYSCONF['apk']['apk_version'], 'file': SYSCONF['apk']['apk_file']})
config = get_sysconfig()
return Response({'version': config['apk']['apk_version'], 'file': config['apk']['apk_file']})
def create(self, request, *args, **kwargs):
"""
@ -664,12 +665,12 @@ class ApkViewSet(MyLoggingMixin, ListModelMixin, CreateModelMixin, GenericViewSe
sr = ApkSerializer(data=request.data)
sr.is_valid(raise_exception=True)
vdata = sr.validated_data
from shutil import copyfile
copyfile(settings.BASE_DIR + vdata['file'], settings.BASE_DIR + '/media/zc_ehs.apk')
global SYSCONF
SYSCONF['apk']['apk_version'] = vdata['version']
SYSCONF['apk']['apk_file'] = vdata['file']
SysConfigView.save_sysconf()
update_sysconfig({
"apk":{
"apk_version": vdata['version'],
"apk_file": vdata['file']
}
})
return Response()
@ -728,27 +729,12 @@ class SysBaseConfigView(APIView):
获取系统基本信息
"""
base_dict = {key: SYSCONF[key] for key in self.read_keys if key in SYSCONF}
config = get_sysconfig()
base_dict = {key: config[key] for key in self.read_keys if key in config}
return Response(base_dict)
class SysConfigView(MyLoggingMixin, APIView):
perms_map = {'get': 'sysconfig.view', 'put': 'sysconfig.update'}
def update_dict(self, dict1, dict2):
for key, value in dict2.items():
if key == 'apk_file': # apk_file拷贝到固定位置
from shutil import copyfile
copyfile(settings.BASE_DIR + value, settings.BASE_DIR + '/media/zc_ehs.apk')
else:
if key in dict1 and isinstance(dict1[key], dict) and isinstance(value, dict):
self.update_dict(dict1[key], value)
else:
dict1[key] = value
@staticmethod
def save_sysconf():
with open(SYS_JSON_PATH, 'wb') as f:
f.write(json.dumps(SYSCONF, indent=4, ensure_ascii=False).encode('utf-8'))
def get(self, request, format=None):
"""
@ -756,7 +742,7 @@ class SysConfigView(MyLoggingMixin, APIView):
获取config json
"""
return Response(SYSCONF)
return Response(get_sysconfig())
@swagger_auto_schema(request_body=Serializer)
def put(self, request, format=None):
@ -766,12 +752,5 @@ class SysConfigView(MyLoggingMixin, APIView):
修改config json
"""
data = request.data
global SYSCONF
old_sysconf = SYSCONF
try:
self.update_dict(SYSCONF, data)
self.save_sysconf()
except:
SYSCONF = old_sysconf
raise
update_sysconfig(data)
return Response()

View File

@ -2,7 +2,7 @@ from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
import json
import logging
from server.settings import SYSCONF
from server.settings import get_sysconfig
from apps.utils.decorators import auto_log
# 实例化myLogger
@ -10,7 +10,8 @@ myLogger = logging.getLogger('log')
@auto_log(name='阿里云短信', raise_exception=False, send_mail=True)
def send_sms(phone: str, template_code: int, template_param: dict):
client = AcsClient(SYSCONF['sms']['xn_key'], SYSCONF['sms']['xn_secret'], 'default')
config = get_sysconfig()
client = AcsClient(config['sms']['xn_key'], config['sms']['xn_secret'], 'default')
request = CommonRequest()
# 固定json
request.set_accept_format('json')
@ -27,7 +28,7 @@ def send_sms(phone: str, template_code: int, template_param: dict):
# 手机号码
request.add_query_param('PhoneNumbers', phone)
# 签名名称
request.add_query_param('SignName', SYSCONF['sms']['xn_sign'])
request.add_query_param('SignName', config['sms']['xn_sign'])
# 模板CODE
request.add_query_param('TemplateCode', template_code)
# 如果有模板参数 填写模板参数 如果无 无须填写

View File

@ -50,4 +50,29 @@ def query_one_dict(sql, params=None):
cursor.execute(sql)
columns = [desc[0] for desc in cursor.description]
row = cursor.fetchone()
return dict(zip(columns, row))
return dict(zip(columns, row))
import pymysql
class DbConnection:
def __init__(self, host, user, password, database):
self.host = host
self.user = user
self.password = password
self.database = database
self.conn = None
self.cursor = None
def __enter__(self):
self.conn = pymysql.connect(
host=self.host,
user=self.user,
password=self.password,
database=self.database
)
self.cursor = self.conn.cursor()
return self.cursor
def __exit__(self, exc_type, exc_val, exc_tb):
self.cursor.close()
self.conn.close()

View File

@ -3,7 +3,7 @@ from celery import Task
from celery import shared_task
import logging
from django.conf import settings
from server.settings import SYSCONF
from server.settings import get_sysconfig
# 实例化myLogger
myLogger = logging.getLogger('log')
@ -11,9 +11,10 @@ myLogger = logging.getLogger('log')
@shared_task
def send_mail_task(**args):
config = get_sysconfig()
if settings.DEBUG is False:
from django.core.mail import send_mail
args['subject'] = '{}:{}_{}_{}'.format(settings.SYS_NAME, settings.SYS_VERSION, SYSCONF['base']['base_name_short'], args.get('subject', '500'))
args['subject'] = '{}:{}_{}_{}'.format(settings.SYS_NAME, settings.SYS_VERSION, config['base']['base_name_short'], args.get('subject', '500'))
args['from_email'] = args.get('from_email', settings.EMAIL_HOST_USER)
args['recipient_list'] = args.get('recipient_list', [settings.EMAIL_HOST_USER])
send_mail(**args)

View File

@ -29,3 +29,4 @@ aliyun-python-sdk-core==2.13.36
xlwt==1.3.0
openpyxl==3.1.0
cron-descriptor==1.2.35
pymysql==1.0.3

View File

@ -14,6 +14,7 @@ from datetime import datetime, timedelta
import os
import json
from . import conf
from django.core.cache import cache
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@ -21,13 +22,38 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/
# 读取配置文件
SYS_JSON_PATH = os.path.join(BASE_DIR, 'server/conf.json')
if not os.path.exists(SYS_JSON_PATH):
raise SystemError('未找到配置文件')
with open(SYS_JSON_PATH, 'r', encoding='utf-8') as f:
SYSCONF = json.loads(f.read())
def get_sysconfig(reload=False):
config = cache.get('system_config')
if config is None or reload:
# 读取配置文件
if not os.path.exists(SYS_JSON_PATH):
raise SystemError('未找到配置文件')
with open(SYS_JSON_PATH, 'r', encoding='utf-8') as f:
config = json.loads(f.read())
cache.set('system_config', config)
return config
return config
def update_dict(dict1, dict2):
for key, value in dict2.items():
if key == 'apk_file': # apk_file拷贝到固定位置
from shutil import copyfile
copyfile(BASE_DIR + value, BASE_DIR + '/media/zc_ehs.apk')
else:
if key in dict1 and isinstance(dict1[key], dict) and isinstance(value, dict):
update_dict(dict1[key], value)
else:
dict1[key] = value
def update_sysconfig(new_dict):
config = get_sysconfig()
update_dict(config, new_dict)
with open(SYS_JSON_PATH, 'wb') as f:
f.write(json.dumps(config, indent=4, ensure_ascii=False).encode('utf-8'))
cache.set('system_config', config)
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = conf.SECRET_KEY
@ -172,7 +198,6 @@ EMAIL_HOST = conf.EMAIL_HOST
EMAIL_PORT = conf.EMAIL_PORT
EMAIL_HOST_USER = conf.EMAIL_HOST_USER
EMAIL_HOST_PASSWORD = conf.EMAIL_HOST_PASSWORD
EMAIL_SUBJECT_PREFIX = SYSCONF['base']['base_name_short']
EMAIL_USE_TLS = conf.EMAIL_USE_TLS
# 默认主键