From 7958eb4492d61cb5a6364c07f7e4aae5d39f225a Mon Sep 17 00:00:00 2001 From: RogerWork Date: Thu, 6 Jun 2024 15:14:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0url=E5=A4=84=E7=90=86?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dspt_api/views.py | 97 +++++++++++++++++++++++++++++++++---- update/utils/get_version.py | 2 +- 2 files changed, 88 insertions(+), 11 deletions(-) diff --git a/dspt_api/views.py b/dspt_api/views.py index 5b205d1..555cbd9 100644 --- a/dspt_api/views.py +++ b/dspt_api/views.py @@ -1,7 +1,9 @@ import json import requests +from urllib.parse import urljoin from django.db.models import Q from django_filters.rest_framework import DjangoFilterBackend +from django_redis import get_redis_connection from rest_framework import filters from rest_framework import viewsets from django.views.decorators.csrf import csrf_exempt @@ -9,7 +11,7 @@ from dspt_api.models import EcChannel, EcEnv, EcApi, EcApiParams, EcCinemaIds, E from dspt_api.serializers import EcChannelSerializer, EcEnvSerializer, EcApiSerializer, EcApiParamsSerializer, \ EcCinemaIdsSerializer, EcRequestLogSerializer, EcApiGroupSerializer -from util.sign import Sign +from dspt_api.util.sign import Sign # Create your views here. @@ -37,7 +39,7 @@ class EcApiParamsViewSet(viewsets.ModelViewSet): class EcCinemaIdsViewSet(viewsets.ModelViewSet): - queryset = EcCinemaIds + queryset = EcCinemaIds.objects.all() serializer_class = EcCinemaIdsSerializer @@ -51,12 +53,7 @@ class EcApiGroupViewSet(viewsets.ModelViewSet): serializer_class = EcApiGroupSerializer -@csrf_exempt -def general_api_url(request): - req_obj = handle_request(request) - return req_obj.url - - +# 内部方法,用于生成requests请求对象 def handle_request(_request): """ POST请求参数 @@ -79,18 +76,98 @@ def handle_request(_request): return req_obj +# 内部方法,用于拼接请求 def prepare_request(_url, _api, _params): req = requests.PreparedRequest() req.prepare_method('GET') - req.prepare_url(url=_url + '/' + _api, params=_params) + req.prepare_url(url=urljoin(_url, _api), params=_params) req.prepare_headers({'host': _url[7:]}) return req +# 外部接口, 用于实时生成url并返回前端 +@csrf_exempt +def general_api_url(request): + """ + 此接口为POST接口 + request 包含 + env dspt或zyds + member_type member或nonmember + api api地址 + params 请求参数 + """ + req_obj = handle_request(request) + return req_obj.url + + +# 对外接口,用于收集用户提交内容后发送请求 @csrf_exempt def send_request(request): + """ + request 包含 + 1. 请求链接 request_url + 2. 返回数据 response_data + 3. 接口 api + 4. 环境 env + """ + # 初始化redis + redis_conn = get_redis_connection() + user_ip = request.META.get('REMOTE_ADDR') + api = request.get('api') + redis_key_api = f'dspt_api_{user_ip}_{api}' + redis_key_user_data = f'dspt_api_{user_ip}_{api}_data' + # 发送请求 req = handle_request(request) response = requests.Session().send(req) + # 记录Redis + if redis_conn.exists(redis_key_api): + redis_conn.delete(redis_key_api) + else: + data = { + 'request_url': request.get('request_url'), + 'response_data': response.json() + } + redis_conn.set(redis_key_api, json.dumps(data), 10 * 60 * 60) + redis_conn.delete(redis_key_user_data) # 插入数据 - + db_data = { + 'ip': user_ip, + 'env': request.get('env'), + 'request': request.get('request_url'), + 'response': response.json() + } + EcRequestLog.objects.create(db_data) return response.json() + + +# 对外接口,用于收集用户选择的数据,例如场次,卖品等,以便后续接口直接调用 +@csrf_exempt +def user_select_data(request): + # 初始化redis + redis_conn = get_redis_connection() + user_ip = request.META.get('REMOTE_ADDR') + api = request.get('api') + redis_key_user_data = f'dspt_api_{user_ip}_{api}_data' + # 记录用户选择 + data = { + 'user_data': request.get('user_data') + } + if redis_conn.exists(redis_key_user_data): + redis_conn.delete(redis_key_user_data) + result = redis_conn.set(redis_key_user_data, json.dumps(data), 10 * 60 * 60) + return result + + +# 对外接口,用于给前端提供上次请求的数据,如果没有则返回数据库中的默认值 +# 若果有些字段是依赖于其他接口返回值生成的则单独处理此接口, 单独处理逻辑在util目录下 +@csrf_exempt +def get_last_request_data(request): + redis_conn = get_redis_connection() + user_ip = request.META.get('REMOTE_ADDR') + api = request.get('api') + + match api: + case '': + pass + case _: + pass diff --git a/update/utils/get_version.py b/update/utils/get_version.py index 8ac4d74..92061d7 100644 --- a/update/utils/get_version.py +++ b/update/utils/get_version.py @@ -74,7 +74,7 @@ class GetVersion(object): 'update_time': timezone.now(), 'is_cloud': '云版本' if res.get('dx_sys_version', '--') == 'CLOUD' else '--', 'remote_label': res.get('cinema_label', '--') if res.get('cinema_label', '--') != '' else '--', - 'ver_id': int(res['server_version'][7:11]) + 'ver_id': int(res['server_version'][13:17]) if res['server_version'].startswith('Cloud_') else int(res['server_version'][7:11]) } print(ip, update_data, db_config) cinema_obj = Cinema.objects.filter(ip=ip).update(**update_data)