feat: 添加亚控restful接口

This commit is contained in:
caoqianming 2024-03-21 18:44:02 +08:00
parent 6e4298873f
commit a737343d3a
5 changed files with 166 additions and 2 deletions

View File

@ -2,3 +2,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": "音响接口访问异常"}
KING_REQUEST_ERROR = {"code": "kio_request_error", "detail": "亚控数采接口访问异常"}

78
apps/third/king/k.py Normal file
View File

@ -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()

View File

@ -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"
}
}

26
apps/third/mixins.py Normal file
View File

@ -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()

View File

@ -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()