增加url处理的逻辑

main
RogerWork 9 months ago
parent d3d930b001
commit 7958eb4492
  1. 97
      dspt_api/views.py
  2. 2
      update/utils/get_version.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

@ -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)

Loading…
Cancel
Save