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