From 16c46902c1e01678fa38b51ab89e14e4869a1f1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E5=89=8D=E6=98=8E?= <909355014@qq.com> Date: Sat, 25 Jun 2022 09:17:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=89=E6=96=B9=E6=8E=A5=E5=8F=A3=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/third/clients.py | 6 ++-- apps/{utils => third}/dahua.py | 57 +++++++++++++++++++++--------- apps/third/errors.py | 4 +++ apps/third/erros.py | 1 - apps/third/migrations/0003_tlog.py | 30 ++++++++++++++++ apps/third/models.py | 23 ++++++------ apps/{utils => third}/speaker.py | 2 +- apps/third/views.py | 2 +- apps/{utils => third}/xunxi.py | 29 +++++++++++++-- apps/utils/errors.py | 3 -- 10 files changed, 118 insertions(+), 39 deletions(-) rename apps/{utils => third}/dahua.py (56%) mode change 100755 => 100644 create mode 100644 apps/third/errors.py delete mode 100755 apps/third/erros.py create mode 100644 apps/third/migrations/0003_tlog.py rename apps/{utils => third}/speaker.py (98%) rename apps/{utils => third}/xunxi.py (75%) mode change 100755 => 100644 diff --git a/apps/third/clients.py b/apps/third/clients.py index 45b51fb4..c0f55aa9 100755 --- a/apps/third/clients.py +++ b/apps/third/clients.py @@ -1,6 +1,6 @@ -from apps.utils.xunxi import XxClient -from apps.utils.dahua import DhClient -from apps.utils.speaker import SpClient +from apps.third.xunxi import XxClient +from apps.third.dahua import DhClient +from apps.third.speaker import SpClient dhClient = DhClient() xxClient = XxClient() spClient = SpClient() diff --git a/apps/utils/dahua.py b/apps/third/dahua.py old mode 100755 new mode 100644 similarity index 56% rename from apps/utils/dahua.py rename to apps/third/dahua.py index 2d1dc903..9019a543 --- a/apps/utils/dahua.py +++ b/apps/third/dahua.py @@ -1,12 +1,15 @@ import time from threading import Thread +import uuid import requests from django.conf import settings from rest_framework.exceptions import APIException, ParseError -from apps.utils.errors import DH_REQUEST_ERROR +from apps.third.errors import DH_REQUEST_ERROR +from apps.third.models import Tlog from apps.utils.tools import print_roundtrip +from django.utils.timezone import now requests.packages.urllib3.disable_warnings() @@ -26,6 +29,7 @@ class DhClient: self.isRuning = True self.token = None self.t = None # 线程 + self.log = {} self.setup() def _get_token_loop(self): @@ -59,16 +63,20 @@ class DhClient: file_path_rela=None, raise_exception=True): if not settings.DAHUA_ENABLED: raise ParseError('大华对接未启用') + self.log = {"requested_at": now(), "id": uuid.uuid4(), "path": url, "method": method, + "params": params, "body": json, "target": "dahua", "result": 10} files = None if file_path_rela: # 相对路径 files = {'file': open(settings.BASE_DIR + file_path_rela, 'rb')} try: if params: url = url.format(**params) + self.log.update({"path": url}) r = getattr(requests, method)('{}{}'.format(settings.DAHUA_BASE_URL, url), - headers=self.headers, params=params, json=json, - timeout=timeout, files=files, verify=False) + headers=self.headers, params=params, json=json, + timeout=timeout, files=files, verify=False) except Exception: + self.handle_log(result='error') if raise_exception: raise APIException(**DH_REQUEST_ERROR) return 'error', DH_REQUEST_ERROR @@ -76,19 +84,36 @@ class DhClient: # print_roundtrip(r) if r.status_code == 200: ret = r.json() - if ret.get('code') == '27001007': - self.get_token() # 重新获取token - self.request(url, method, params, json, timeout, file_path_rela, raise_exception) - else: - if ret['code'] not in ['0', '100', '00000', '1000', 0, 100, 1000]: - detail = '大华错误:' + \ - '{}|{}{}{}'.format(str(ret['code']), ret.get('errMsg', ''), - ret.get('desc', ''), str(ret.get('data', ''))) - err_detail = dict(detail=detail, code='dh_'+str(ret['code'])) - if raise_exception: - raise ParseError(**err_detail) - return 'fail', dict(detail=detail, code='dh_'+str(ret['code'])) - return 'success', ret['data'] if 'data' in ret else None + if ret['code'] not in ['0', '100', '00000', '1000', 0, 100, 1000]: + detail = '大华错误:' + \ + '{}|{}{}{}'.format(str(ret['code']), ret.get('errMsg', ''), + ret.get('desc', ''), str(ret.get('data', ''))) + err_detail = dict(detail=detail, code='dh_'+str(ret['code'])) + self.handle_log(result='fail', response=ret) + if raise_exception: + raise ParseError(**err_detail) + return 'fail', dict(detail=detail, code='dh_'+str(ret['code'])) + self.handle_log(result='success', response=ret) + return 'success', ret['data'] if 'data' in ret else None + + self.handle_log(result='error', response=None) if raise_exception: raise APIException(**DH_REQUEST_ERROR) return 'error', DH_REQUEST_ERROR + + 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): + self.log.update({ + "result": result, + "response": response, + "response_ms": self._get_response_ms() + }) + Tlog(**self.log).save() diff --git a/apps/third/errors.py b/apps/third/errors.py new file mode 100644 index 00000000..b50006c5 --- /dev/null +++ b/apps/third/errors.py @@ -0,0 +1,4 @@ +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 diff --git a/apps/third/erros.py b/apps/third/erros.py deleted file mode 100755 index c58b5d49..00000000 --- a/apps/third/erros.py +++ /dev/null @@ -1 +0,0 @@ -TAPI_CODE_WRONG = {"code": "tapi_code_wrong", "detail": "三方接口请求标识有误"} diff --git a/apps/third/migrations/0003_tlog.py b/apps/third/migrations/0003_tlog.py new file mode 100644 index 00000000..64a725a4 --- /dev/null +++ b/apps/third/migrations/0003_tlog.py @@ -0,0 +1,30 @@ +# Generated by Django 3.2.12 on 2022-06-25 01:06 + +from django.db import migrations, models +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('third', '0002_tdevice_is_clock'), + ] + + operations = [ + migrations.CreateModel( + name='Tlog', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), + ('target', models.CharField(max_length=20, verbose_name='请求目标')), + ('result', models.CharField(max_length=20, verbose_name='请求结果')), + ('path', models.CharField(help_text='请求地址', max_length=400)), + ('requested_at', models.DateTimeField()), + ('response_ms', models.PositiveIntegerField(default=0)), + ('response', models.JSONField(blank=True, null=True)), + ('method', models.CharField(max_length=10)), + ('url', models.TextField(blank=True, null=True)), + ('params', models.JSONField(blank=True, null=True)), + ('body', models.JSONField(blank=True, null=True)), + ], + ), + ] diff --git a/apps/third/models.py b/apps/third/models.py index 9e6e0967..98339239 100755 --- a/apps/third/models.py +++ b/apps/third/models.py @@ -42,18 +42,17 @@ class TDevice(BaseModel): null=False, blank=True) -class Tlog(BaseModel): +class Tlog(models.Model): """第三方请求与处理日志 """ id = models.UUIDField(primary_key=True, default=uuid.uuid4) - result_type = models.PositiveSmallIntegerField('结果类型', - default=10, - help_text='10成功20失败30错误') - result = models.JSONField(null=True, blank=True) - request_method = models.CharField(max_length=10) - request_url = models.TextField(null=True, blank=True) - request_params = models.JSONField(null=True, blank=True) - request_json = models.JSONField(null=True, blank=True) - bind_my_request = models.CharField('关联用户请求ID', - max_length=50, - null=True, blank=True) + target = models.CharField('请求目标', max_length=20) + result = models.CharField('请求结果', max_length=20) + path = models.CharField(max_length=400, help_text="请求地址") + requested_at = models.DateTimeField() + response_ms = models.PositiveIntegerField(default=0) + response = models.JSONField(null=True, blank=True) + method = models.CharField(max_length=10) + url = models.TextField(null=True, blank=True) + params = models.JSONField(null=True, blank=True) + body = models.JSONField(null=True, blank=True) diff --git a/apps/utils/speaker.py b/apps/third/speaker.py similarity index 98% rename from apps/utils/speaker.py rename to apps/third/speaker.py index 720d0635..e7f5420b 100644 --- a/apps/utils/speaker.py +++ b/apps/third/speaker.py @@ -5,7 +5,7 @@ import requests from rest_framework.exceptions import APIException, ParseError from django.conf import settings -from apps.utils.errors import SP_REQUEST_ERROR +from apps.third.errors import SP_REQUEST_ERROR from apps.utils.tools import print_roundtrip requests.packages.urllib3.disable_warnings() diff --git a/apps/third/views.py b/apps/third/views.py index 626c1a96..b8287f1b 100755 --- a/apps/third/views.py +++ b/apps/third/views.py @@ -3,7 +3,7 @@ from rest_framework.exceptions import ParseError, APIException from apps.ecm.service import EcmService from apps.hrm.services import HrmService from apps.third.tapis import dhapis, xxapis, spapis -from apps.third.erros import TAPI_CODE_WRONG +from apps.third.errors import TAPI_CODE_WRONG from apps.third.clients import dhClient, spClient, xxClient from apps.utils.mixins import MyLoggingMixin from rest_framework.response import Response diff --git a/apps/utils/xunxi.py b/apps/third/xunxi.py old mode 100755 new mode 100644 similarity index 75% rename from apps/utils/xunxi.py rename to apps/third/xunxi.py index f7e7dc74..151d06fd --- a/apps/utils/xunxi.py +++ b/apps/third/xunxi.py @@ -1,12 +1,14 @@ import time from threading import Thread - +import uuid import requests from django.conf import settings from rest_framework.exceptions import APIException, ParseError -from apps.utils.errors import XX_REQUEST_ERROR +from apps.third.errors import XX_REQUEST_ERROR +from apps.third.models import Tlog from apps.utils.tools import print_roundtrip +from django.utils.timezone import now requests.packages.urllib3.disable_warnings() @@ -23,6 +25,7 @@ class XxClient: self.isGetingToken = False self.isRuning = True self.token = '' + self.log = {} self.t = None self.setup() @@ -65,6 +68,8 @@ class XxClient: params['accessToken'] = self.token json['username'] = self.username json['buildId'] = settings.XX_BUILDID + self.log = {"requested_at": now(), "id": uuid.uuid4(), "path": url, "method": method, + "params": params, "body": json, "target": "xunxi", "result": 10} if self.isGetingToken: req_num = 0 while True: @@ -87,10 +92,30 @@ class XxClient: if ret['errorCode'] != 0: err_detail = dict(detail='寻息错误:' + '|'.join(ret['errorMsg']), code='xx_' + str(ret['errorCode'])) + self.handle_log(result='fail', response=None) if raise_exception: raise ParseError(**err_detail) return 'fail', err_detail + self.handle_log(result='success', response=None) return 'success', ret['data'] + self.handle_log(result='error', response=None) if raise_exception: raise APIException(**XX_REQUEST_ERROR) return 'error', XX_REQUEST_ERROR + + 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): + self.log.update({ + "result": result, + "response": response, + "response_ms": self._get_response_ms() + }) + Tlog(**self.log).save() diff --git a/apps/utils/errors.py b/apps/utils/errors.py index fdfbcb60..b518d00d 100755 --- a/apps/utils/errors.py +++ b/apps/utils/errors.py @@ -1,5 +1,2 @@ -XX_REQUEST_ERROR = {"code": "xx_request_error", "detail": "寻息接口访问异常"} -DH_REQUEST_ERROR = {"code": "dh_request_error", "detail": "大华接口访问异常"} -SP_REQUEST_ERROR = {"code": "sp_request_error", "detail": "音响接口访问异常"} SIGN_MAKE_FAIL = {"code": "sign_make_fail", "detail": "签名照生成失败,请重新上传"} PKS_ERROR = {"code": "pks_error", "detail": "未获取到主键列表"}