|
|
@ -1,7 +1,9 @@ |
|
|
|
import json |
|
|
|
import json |
|
|
|
import requests |
|
|
|
import requests |
|
|
|
|
|
|
|
from urllib.parse import urljoin |
|
|
|
from django.db.models import Q |
|
|
|
from django.db.models import Q |
|
|
|
from django_filters.rest_framework import DjangoFilterBackend |
|
|
|
from django_filters.rest_framework import DjangoFilterBackend |
|
|
|
|
|
|
|
from django_redis import get_redis_connection |
|
|
|
from rest_framework import filters |
|
|
|
from rest_framework import filters |
|
|
|
from rest_framework import viewsets |
|
|
|
from rest_framework import viewsets |
|
|
|
from django.views.decorators.csrf import csrf_exempt |
|
|
|
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, \ |
|
|
|
from dspt_api.serializers import EcChannelSerializer, EcEnvSerializer, EcApiSerializer, EcApiParamsSerializer, \ |
|
|
|
EcCinemaIdsSerializer, EcRequestLogSerializer, EcApiGroupSerializer |
|
|
|
EcCinemaIdsSerializer, EcRequestLogSerializer, EcApiGroupSerializer |
|
|
|
|
|
|
|
|
|
|
|
from util.sign import Sign |
|
|
|
from dspt_api.util.sign import Sign |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Create your views here. |
|
|
|
# Create your views here. |
|
|
@ -37,7 +39,7 @@ class EcApiParamsViewSet(viewsets.ModelViewSet): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class EcCinemaIdsViewSet(viewsets.ModelViewSet): |
|
|
|
class EcCinemaIdsViewSet(viewsets.ModelViewSet): |
|
|
|
queryset = EcCinemaIds |
|
|
|
queryset = EcCinemaIds.objects.all() |
|
|
|
serializer_class = EcCinemaIdsSerializer |
|
|
|
serializer_class = EcCinemaIdsSerializer |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -51,12 +53,7 @@ class EcApiGroupViewSet(viewsets.ModelViewSet): |
|
|
|
serializer_class = EcApiGroupSerializer |
|
|
|
serializer_class = EcApiGroupSerializer |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@csrf_exempt |
|
|
|
# 内部方法,用于生成requests请求对象 |
|
|
|
def general_api_url(request): |
|
|
|
|
|
|
|
req_obj = handle_request(request) |
|
|
|
|
|
|
|
return req_obj.url |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def handle_request(_request): |
|
|
|
def handle_request(_request): |
|
|
|
""" |
|
|
|
""" |
|
|
|
POST请求参数 |
|
|
|
POST请求参数 |
|
|
@ -79,18 +76,98 @@ def handle_request(_request): |
|
|
|
return req_obj |
|
|
|
return req_obj |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 内部方法,用于拼接请求 |
|
|
|
def prepare_request(_url, _api, _params): |
|
|
|
def prepare_request(_url, _api, _params): |
|
|
|
req = requests.PreparedRequest() |
|
|
|
req = requests.PreparedRequest() |
|
|
|
req.prepare_method('GET') |
|
|
|
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:]}) |
|
|
|
req.prepare_headers({'host': _url[7:]}) |
|
|
|
return req |
|
|
|
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 |
|
|
|
@csrf_exempt |
|
|
|
def send_request(request): |
|
|
|
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) |
|
|
|
req = handle_request(request) |
|
|
|
response = requests.Session().send(req) |
|
|
|
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() |
|
|
|
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 |
|
|
|