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

@ -1,4 +1,5 @@
TAPI_CODE_WRONG = {"code": "tapi_code_wrong", "detail": "三方接口请求标识有误"} TAPI_CODE_WRONG = {"code": "tapi_code_wrong", "detail": "三方接口请求标识有误"}
XX_REQUEST_ERROR = {"code": "xx_request_error", "detail": "寻息接口访问异常"} XX_REQUEST_ERROR = {"code": "xx_request_error", "detail": "寻息接口访问异常"}
DH_REQUEST_ERROR = {"code": "dh_request_error", "detail": "大华接口访问异常"} DH_REQUEST_ERROR = {"code": "dh_request_error", "detail": "大华接口访问异常"}
SP_REQUEST_ERROR = {"code": "sp_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.dahua import dhClient
from apps.third.xunxi import xxClient from apps.third.xunxi import xxClient
from apps.third.speaker import spClient from apps.third.speaker import spClient
from apps.third.king.k import kingClient
@shared_task(base=CustomTask) @shared_task(base=CustomTask)
def clear_tlog(days: int =7): def clear_tlog(days: int = 7):
"""清除N天前的日志记录,默认七天 """清除N天前的日志记录,默认七天
清除N天前的日志记录 清除N天前的日志记录
@ -28,6 +29,10 @@ def get_third_token():
spClient._get_token() spClient._get_token()
@shared_task(base=CustomTask)
def get_king_token():
kingClient._get_token()
# @shared_task(base=CustomTask) # @shared_task(base=CustomTask)
# def get_dh_token(): # def get_dh_token():
# dhClient._get_token() # dhClient._get_token()