# -*- encoding: utf-8 -*- """ @File : DeviceVersionInfoController.py @Time : 2024/11/20 14:20 @Author : stephen @Email : zhangdongming@asj6.wecom.work @Software: PyCharm """ import json from django.http import QueryDict from django.views import View from Ansjer.config import LOGGER from Model.models import DeviceVersionInfo from Object.Enums.RedisKeyConstant import RedisKeyConstant from Object.RedisObject import RedisObject from Object.ResponseObject import ResponseObject from Object.TokenObject import TokenObject from Service.CommonService import CommonService class DeviceVersionInfoView(View): def get(self, request, *args, **kwargs): request.encoding = 'utf-8' operation = kwargs.get('operation') return self.validation(request.GET, request, operation) def post(self, request, *args, **kwargs): request.encoding = 'utf-8' operation = kwargs.get('operation') return self.validation(request.POST, request, operation) def delete(self, request, *args, **kwargs): request.encoding = 'utf-8' operation = kwargs.get('operation') delete = QueryDict(request.body) if not delete: delete = request.GET return self.validation(delete, request, operation) def put(self, request, *args, **kwargs): request.encoding = 'utf-8' operation = kwargs.get('operation') put = QueryDict(request.body) return self.validation(put, request, operation) def validation(self, request_dict, request, operation): response = ResponseObject('cn') tko = TokenObject(request.META.get('HTTP_AUTHORIZATION')) if tko.code != 0: return response.json(tko.code) response.lang = tko.lang userID = tko.userID if operation == 'getInfo': return self.get_device_version_info(userID, request, request_dict, response) else: return response.json(414) @classmethod def get_device_version_info(cls, user_id, request, request_dict, response): # 从请求字典中获取uid和version uid = request_dict.get('uid') version = request_dict.get('version') # 检查version是否存在 if not version: return response.json(444) # 错误代码:没有提供version try: # 示例输入字符串 ip = CommonService.get_ip_address(request) LOGGER.info(f'获取设备版本配置信息 user: {user_id}, uid: {uid}, version: {version}, ip: {ip} ') # 从右侧分割字符串,获取版本和设备代码 ver, d_code = version.rsplit('.', 1) # 使用从右到左分割 ver = ver.replace('V', '') # 移除版本前的'V' # 创建Redis对象 redis = RedisObject() # 构建Redis键 version_key = RedisKeyConstant.ZOSI_DEVICE_VERSION_INFO.value + ver + d_code # 尝试从Redis中获取数据 version_info = redis.get_data(version_key) if version_info: # 如果在Redis中找到了数据,直接返回 return response.json(0, json.loads(version_info)) # 从数据库查询设备版本信息 device_version_qs = DeviceVersionInfo.objects.filter(d_code=d_code, software_ver=ver).values() if not device_version_qs.exists(): return response.json(173) # 错误代码:未找到设备版本信息 # 从QuerySet中获取设备信息 device_info = device_version_qs # 将设备信息序列化为JSON device_json = json.dumps(device_info[0]) # 将数据写入Redis,以便后续使用 redis.set_data(version_key, device_json, 60 * 60 * 24) # 设置TTL为24小时 # 返回设备信息 return response.json(0, device_info[0]) except Exception as e: return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))