feat: 添加亚控restful接口
This commit is contained in:
parent
6e4298873f
commit
a737343d3a
|
@ -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": "亚控数采接口访问异常"}
|
||||||
|
|
|
@ -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()
|
|
@ -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"
|
||||||
|
}
|
||||||
|
}
|
|
@ -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()
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue