三方调用接口优化

This commit is contained in:
caoqianming 2022-04-11 10:41:26 +08:00
parent a3cb4bb34c
commit cff1ecbe00
11 changed files with 73 additions and 50 deletions

View File

@ -4,10 +4,13 @@ from django.urls import path, include
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
from apps.develop.views import BackupDatabase, BackupMedia, ReloadServerGit, ReloadServerOnly from apps.develop.views import BackupDatabase, BackupMedia, ReloadServerGit, ReloadServerOnly
API_BASE_URL = 'api/develop/'
HTML_BASE_URL = 'develop/'
urlpatterns = [ urlpatterns = [
path('reload_server_git/', ReloadServerGit.as_view()), path(API_BASE_URL + 'reload_server_git/', ReloadServerGit.as_view()),
path('reload_server_only/', ReloadServerOnly.as_view()), path(API_BASE_URL + 'reload_server_only/', ReloadServerOnly.as_view()),
path('backup_database/', BackupDatabase.as_view()), path(API_BASE_URL + 'backup_database/', BackupDatabase.as_view()),
path('backup_media/', BackupMedia.as_view()) path(API_BASE_URL + 'backup_media/', BackupMedia.as_view())
] ]

View File

@ -13,7 +13,9 @@ class ReloadServerGit(APIView):
permission_classes = [IsAdminUser] permission_classes = [IsAdminUser]
def post(self, request): def post(self, request):
""" """
拉取代码并重启服务 拉取后端代码并重启服务
拉取后端代码并重启服务
""" """
completed = reload_server_git() completed = reload_server_git()
if completed.returncode == 0: if completed.returncode == 0:
@ -25,6 +27,8 @@ class ReloadServerOnly(APIView):
permission_classes = [IsAdminUser] permission_classes = [IsAdminUser]
def post(self, request): def post(self, request):
""" """
仅重启服务
仅重启服务 仅重启服务
""" """
completed = reload_server_only() completed = reload_server_only()
@ -38,6 +42,8 @@ class BackupDatabase(APIView):
permission_classes = [IsAdminUser] permission_classes = [IsAdminUser]
def post(self, request): def post(self, request):
""" """
备份数据库到指定位置
备份数据库到指定位置 备份数据库到指定位置
""" """
completed = backup_database() completed = backup_database()
@ -50,6 +56,8 @@ class BackupMedia(APIView):
permission_classes = [IsAdminUser] permission_classes = [IsAdminUser]
def post(self, request): def post(self, request):
""" """
备份资源到指定位置
备份资源到指定位置 备份资源到指定位置
""" """
completed = backup_media() completed = backup_media()

View File

@ -1,3 +1,4 @@
import json
import re import re
from django_celery_beat.models import PeriodicTask, CrontabSchedule, IntervalSchedule from django_celery_beat.models import PeriodicTask, CrontabSchedule, IntervalSchedule
from rest_framework import serializers from rest_framework import serializers
@ -9,6 +10,7 @@ from .models import (Dict, DictType, File, Dept, Permission, Post,
Role, User, UserPost) Role, User, UserPost)
from rest_framework.exceptions import ParseError, APIException from rest_framework.exceptions import ParseError, APIException
from django.db import transaction from django.db import transaction
from apps.third.tapis import dhapis
class IntervalSerializer(CustomModelSerializer): class IntervalSerializer(CustomModelSerializer):
class Meta: class Meta:
@ -195,15 +197,9 @@ class DeptCreateUpdateSerializer(CustomModelSerializer):
"name":validated_data['name'], "name":validated_data['name'],
"service":"ehs" "service":"ehs"
} }
ok, res = dhClient.request('/evo-apigw/evo-brm/1.0.0/department/add', _, res = dhClient.request(**dhapis['dept_create'],json=data)
'post',json=data) third_info = {'dh_id':str(res['id'])}
if ok == 'success': validated_data['third_info'] = third_info
third_info = {'dh_id':str(res['id'])}
validated_data['third_info'] = third_info
elif ok == 'fail':
raise ParseError(**res)
else:
raise APIException(**res)
return super().create(validated_data) return super().create(validated_data)
@ -217,14 +213,7 @@ class DeptCreateUpdateSerializer(CustomModelSerializer):
"parentId":1, "parentId":1,
"name":validated_data['name'] "name":validated_data['name']
} }
ok, res = dhClient.request('/evo-apigw/evo-brm/1.0.0/department/update', dhClient.request(**dhapis['dept_update'],json=data)
'put',json=data)
if ok == 'success':
pass
elif ok == 'fail':
raise ParseError(**res)
else:
raise APIException(**res)
return super().update(instance, validated_data) return super().update(instance, validated_data)
class UserSimpleSerializer(CustomModelSerializer): class UserSimpleSerializer(CustomModelSerializer):
@ -244,13 +233,6 @@ class UserListSerializer(CustomModelSerializer):
model = User model = User
exclude = ['password'] exclude = ['password']
@staticmethod
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.select_related('superior', 'belong_dept')
queryset = queryset.prefetch_related('posts')
return queryset
def phone_check(phone): def phone_check(phone):
re_phone = '^1[358]\d{9}$|^147\d{8}$|^176\d{8}$' re_phone = '^1[358]\d{9}$|^147\d{8}$|^176\d{8}$'
if not re.match(re_phone, phone): if not re.match(re_phone, phone):

1
apps/third/erros.py Normal file
View File

@ -0,0 +1 @@
TAPI_CODE_WRONG = {"code":"tapi_code_wrong", "detail":"三方接口请求标识有误"}

View File

@ -8,7 +8,8 @@ class RequestCommonSerializer(serializers.Serializer):
('put','put'), ('put','put'),
('delete','delete') ('delete','delete')
) )
url = serializers.CharField(label='请求地址') url = serializers.CharField(label='请求地址', required=False)
method = serializers.ChoiceField(label='请求方法', choices=method_choice) method = serializers.ChoiceField(label='请求方法', choices=method_choice, required=False)
params = serializers.JSONField(label='请求参数', required=False, allow_null=True) params = serializers.JSONField(label='请求参数', required=False, allow_null=True)
json = serializers.JSONField(label='请求body', required=False, allow_null=True) json = serializers.JSONField(label='请求body(json格式)', required=False, allow_null=True)
code = serializers.CharField(label='请求短标识', required=False)

16
apps/third/tapis.py Normal file
View File

@ -0,0 +1,16 @@
# 大华API接口
dhapis = {
"dept_create":{
"url":"/evo-apigw/evo-brm/1.0.0/department/add",
"method":"post"
},
"dept_update":{
"url":"/evo-apigw/evo-brm/1.0.0/department/update",
"method":"put"
}
}
# 寻息API接口
xxapis = {
}

View File

@ -1,4 +1,6 @@
from rest_framework.exceptions import ParseError, APIException from rest_framework.exceptions import ParseError, APIException
from apps.third import tapis
from apps.third.erros import TAPI_CODE_WRONG
from apps.utils.dahua import dhClient from apps.utils.dahua import dhClient
from apps.utils.errors import XX_REQUEST_ERROR from apps.utils.errors import XX_REQUEST_ERROR
from apps.utils.xunxi import xxClient from apps.utils.xunxi import xxClient
@ -81,17 +83,19 @@ class XxCommonViewSet(CreateModelMixin, CustomGenericViewSet):
serializer = self.get_serializer(data=request.data) serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
vdata = serializer.validated_data vdata = serializer.validated_data
ok, res = xxClient.request( if vdata.get('code', ''):
try:
dhapi = tapis.dhapis[vdata['code']]
except:
raise ParseError(**TAPI_CODE_WRONG)
vdata['url'] = dhapi['url']
vdata['method'] = dhapi['method']
_, res = xxClient.request(
url=vdata['url'], url=vdata['url'],
method=vdata.get('method', 'post'), method=vdata.get('method', 'post'),
params=vdata.get('params', {}), params=vdata.get('params', {}),
json=vdata.get('data', {})) json=vdata.get('data', {}))
if ok == 'success': return Response(res)
return Response(res)
elif ok == 'fail':
raise ParseError(**res)
else:
raise APIException(**res)
class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet): class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet):
@ -105,14 +109,16 @@ class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet):
serializer = self.get_serializer(data=request.data) serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
vdata = serializer.validated_data vdata = serializer.validated_data
ok, res = dhClient.request( if vdata.get('code', ''):
try:
xxapi = tapis.xxapis[vdata['code']]
except:
raise ParseError(**TAPI_CODE_WRONG)
vdata['url'] = xxapi['url']
vdata['method'] = xxapi['method']
_, res = dhClient.request(
url=vdata['url'], url=vdata['url'],
method=vdata.get('method', 'post'), method=vdata.get('method', 'post'),
params=vdata.get('params', {}), params=vdata.get('params', {}),
json=vdata.get('data', {})) json=vdata.get('data', {}))
if ok == 'success': return Response(res)
return Response(res)
elif ok == 'fail':
raise ParseError(**res)
else:
raise APIException(**res)

View File

@ -65,7 +65,7 @@ class DhClient:
self.isRuning = False self.isRuning = False
self.t.join() self.t.join()
def request(self, url:str, method:str, params=dict(), json=dict(), timeout=20): def request(self, url:str, method:str, params=dict(), json=dict(), timeout=20, raise_exception=True):
if self.isGetingToken: if self.isGetingToken:
req_num = 0 req_num = 0
while True: while True:
@ -91,8 +91,13 @@ class DhClient:
else: else:
if ret['code'] not in ['0', '100', '00000', '1000', 0, 100, 1000]: if ret['code'] not in ['0', '100', '00000', '1000', 0, 100, 1000]:
detail = '{}|{}{}'.format(str(ret['code']), ret.get('errMsg',''), ret.get('desc', '')) detail = '{}|{}{}'.format(str(ret['code']), ret.get('errMsg',''), ret.get('desc', ''))
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 'fail', dict(detail=detail, code='dh_'+str(ret['code']))
return 'success', ret['data'] return 'success', ret['data']
if raise_exception:
raise APIException(**DH_REQUEST_ERROR)
return 'error', DH_REQUEST_ERROR return 'error', DH_REQUEST_ERROR
dhClient = DhClient() dhClient = DhClient()

View File

@ -142,7 +142,7 @@ class MyLoggingMixin(object):
"response_ms": self._get_response_ms(), "response_ms": self._get_response_ms(),
"response": self._clean_data(rendered_content), "response": self._clean_data(rendered_content),
"status_code": response.status_code, "status_code": response.status_code,
"agent": self._get_agent(), "agent": self._get_agent(request),
} }
) )
try: try:

View File

@ -176,8 +176,8 @@ REST_FRAMEWORK = {
'DATETIME_FORMAT': '%Y-%m-%d %H:%M:%S', 'DATETIME_FORMAT': '%Y-%m-%d %H:%M:%S',
'DATE_FORMAT': '%Y-%m-%d', 'DATE_FORMAT': '%Y-%m-%d',
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema', 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
'UNAUTHENTICATED_USER': None, # 'UNAUTHENTICATED_USER': None,
'UNAUTHENTICATED_TOKEN': None, # 'UNAUTHENTICATED_TOKEN': None,
'EXCEPTION_HANDLER': 'apps.utils.exceptions.custom_exception_hander', 'EXCEPTION_HANDLER': 'apps.utils.exceptions.custom_exception_hander',
} }
# simplejwt配置 # simplejwt配置

View File

@ -46,6 +46,7 @@ urlpatterns = [
path('', include('apps.wf.urls')), path('', include('apps.wf.urls')),
path('', include('apps.third.urls')), path('', include('apps.third.urls')),
path('', include('apps.utils.urls')), path('', include('apps.utils.urls')),
path('', include('apps.develop.urls')),