From a737343d3ab7bd757735543648e74eb80cb417ba Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 21 Mar 2024 18:44:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E4=BA=9A=E6=8E=A7res?= =?UTF-8?q?tful=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/third/errors.py | 3 +- apps/third/king/k.py | 78 +++++++++++++++++++++++++++++++++++++ apps/third/king/king_api.py | 54 +++++++++++++++++++++++++ apps/third/mixins.py | 26 +++++++++++++ apps/third/tasks.py | 7 +++- 5 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 apps/third/king/k.py create mode 100644 apps/third/king/king_api.py create mode 100644 apps/third/mixins.py diff --git a/apps/third/errors.py b/apps/third/errors.py index b50006c5..b72d55c0 100644 --- a/apps/third/errors.py +++ b/apps/third/errors.py @@ -1,4 +1,5 @@ TAPI_CODE_WRONG = {"code": "tapi_code_wrong", "detail": "三方接口请求标识有误"} XX_REQUEST_ERROR = {"code": "xx_request_error", "detail": "寻息接口访问异常"} DH_REQUEST_ERROR = {"code": "dh_request_error", "detail": "大华接口访问异常"} -SP_REQUEST_ERROR = {"code": "sp_request_error", "detail": "音响接口访问异常"} \ No newline at end of file +SP_REQUEST_ERROR = {"code": "sp_request_error", "detail": "音响接口访问异常"} +KING_REQUEST_ERROR = {"code": "kio_request_error", "detail": "亚控数采接口访问异常"} diff --git a/apps/third/king/k.py b/apps/third/king/k.py new file mode 100644 index 00000000..9abca14b --- /dev/null +++ b/apps/third/king/k.py @@ -0,0 +1,78 @@ +import logging +import traceback +import uuid +import requests +from requests.exceptions import RequestException +from django.conf import settings +from rest_framework.exceptions import APIException, ParseError + +from apps.third.errors import KING_REQUEST_ERROR +from apps.utils.tools import print_roundtrip +from django.utils.timezone import now +from apps.third.king import king_api +from apps.utils.tools import singleton +from django.core.cache import cache +from apps.third.mixins import HandleLogMixin +requests.packages.urllib3.disable_warnings() +myLogger = logging.getLogger('log') + + +@singleton +class KingClient(HandleLogMixin): + """ + 亚控数采 + """ + + def __init__(self) -> None: + if settings.KING_ENABLED: + self.headers = {} + self.log = {} + # self._get_token() + + def _get_token(self): + king_token = cache.get('king_token', None) + if king_token: + is_ok, _ = self.request( + **king_api['heartbeat'], headers={'Authorization': king_token}, raise_exception=False, timeout=10) + if is_ok == 'success': + return + json = { + 'username': settings.KING_USERNAME, + 'password': settings.KING_PASSWORD + } + _, res = self.request( + **king_api['login'], json=json, timeout=10) + cache.set('king_token', res['Authorization'], timeout=None) + + def request(self, url: str, method: str = 'post', params=dict(), json=dict(), timeout=20, raise_exception=True): + if not settings.KING_ENABLED: + raise ParseError('亚控对接未启用') + self.headers['Authorization'] = cache.get('king_token', '') + self.log = {"requested_at": now(), "id": uuid.uuid4(), "path": url, "method": method, + "params": params, "body": json, "target": "king", "result": 10, "headers": self.headers} + try: + r = getattr(requests, method)('{}{}'.format(settings.KING_BASE_URL, url), + headers=self.headers, params=params, json=json, timeout=timeout, verify=False) + # if settings.DEBUG: + # print_roundtrip(r) + ret = r.text + if 300 > r.status_code >= 200: + ret = r.json() + if ret['code'] != 0: + err_detail = dict(detail='亚控错误:' + '|'.join(ret['message']), + code='king_' + str(ret['code'])) + self.handle_log(result='fail', response=ret) + if raise_exception: + raise ParseError(**err_detail) + return 'fail', err_detail + return 'success', ret['data'] + else: + self.handle_log(result='error', response=ret) + except RequestException: + self.handle_log(result='error', errors=traceback.format_exc()) + if raise_exception: + raise APIException(**KING_REQUEST_ERROR) + return 'error', KING_REQUEST_ERROR + + +kingClient = KingClient() diff --git a/apps/third/king/king_api.py b/apps/third/king/king_api.py new file mode 100644 index 00000000..9867311d --- /dev/null +++ b/apps/third/king/king_api.py @@ -0,0 +1,54 @@ +kapis = { + "login": { + "url": "/api/v1/login", + "method": "post" + }, + "logout": { + "url": "/api/v1/logout", + "method": "post" + }, + "read_variables": { + "url": "/api/v1/variables", + "method": "get" + }, + "read_allrealvalue": { + "url": "/api/v1/allrealvalue", + "method": "get" + }, + "read_devicerealvalue": { + "url": "/api/v1/devicerealvalue", + "method": "get" + }, + "read_grouprealvalue": { + "url": "/api/v1/grouprealvalue", + "method": "get" + }, + "read_tagrealvalue": { + "url": "/api/v1/realvalue", + "method": "get" + }, + "read_batchtagrealvalue": { + "url": "/api/v1/batchrealvalue", + "method": "get" + }, + "read_devicestatus": { + "url": "/api/v1/devicestatus", + "method": "get" + }, + "write_realvariables": { + "url": "/api/v1/realvariables", + "method": "post" + }, + "heartbeat": { + "url": "/api/v1/heartbeat", + "method": "post" + }, + "read_alldevicestatus": { + "url": "/api/v1/alldevicestatus", + "method": "get" + }, + "get_loginlist": { + "url": "/api/v1/loginlist", + "method": "get" + } +} diff --git a/apps/third/mixins.py b/apps/third/mixins.py new file mode 100644 index 00000000..2cbdd7b2 --- /dev/null +++ b/apps/third/mixins.py @@ -0,0 +1,26 @@ +from django.utils.timezone import now +from apps.third.models import Tlog + + +class HandleLogMixin: + """ + 记录请求第三方的日志 + """ + + def _get_response_ms(self): + """ + Get the duration of the request response cycle is milliseconds. + In case of negative duration 0 is returned. + """ + response_timedelta = now() - self.log["requested_at"] + response_ms = int(response_timedelta.total_seconds() * 1000) + return max(response_ms, 0) + + def handle_log(self, result, response=None, errors=None): + self.log.update({ + "result": result, + "response": response, + "response_ms": self._get_response_ms(), + "errors": errors + }) + Tlog(**self.log).save() diff --git a/apps/third/tasks.py b/apps/third/tasks.py index a78e779e..5720e6ac 100644 --- a/apps/third/tasks.py +++ b/apps/third/tasks.py @@ -8,10 +8,11 @@ from django.utils import timezone from apps.third.dahua import dhClient from apps.third.xunxi import xxClient from apps.third.speaker import spClient +from apps.third.king.k import kingClient @shared_task(base=CustomTask) -def clear_tlog(days: int =7): +def clear_tlog(days: int = 7): """清除N天前的日志记录,默认七天 清除N天前的日志记录 @@ -28,6 +29,10 @@ def get_third_token(): spClient._get_token() +@shared_task(base=CustomTask) +def get_king_token(): + kingClient._get_token() + # @shared_task(base=CustomTask) # def get_dh_token(): # dhClient._get_token()