feat: ADRF async views (phase1) + native async serializers (phase2) + async cache infra

This commit is contained in:
async-upgrade
2026-09-06 14:26:17 +08:00
parent 9a6577f71e
commit 8f488fcaaa
55 changed files with 2224 additions and 1513 deletions
+15 -13
View File
@@ -1,15 +1,16 @@
from django.http import JsonResponse
from rest_framework.views import APIView
from adrf.views import APIView
from rest_framework import status
from rest_framework.decorators import permission_classes
from rest_framework.permissions import AllowAny
from asgiref.sync import sync_to_async
from ..models import CompressionHistory
from ..serializers import CompressionHistorySerializer
@permission_classes([AllowAny])
class CompressionHistoryListView(APIView):
def get(self, request):
async def get(self, request):
user = request.user if request.user.is_authenticated else None
session_id = request.query_params.get('session_id')
@@ -29,8 +30,8 @@ class CompressionHistoryListView(APIView):
start = (page - 1) * page_size
end = start + page_size
total = histories.count()
serializer = CompressionHistorySerializer(histories[start:end], many=True)
total = await histories.acount()
serializer = CompressionHistorySerializer([h async for h in histories[start:end]], many=True)
return JsonResponse({
'success': True,
@@ -40,7 +41,7 @@ class CompressionHistoryListView(APIView):
'page_size': page_size
})
def post(self, request):
async def post(self, request):
data = request.data.copy()
if request.user.is_authenticated:
@@ -48,7 +49,8 @@ class CompressionHistoryListView(APIView):
serializer = CompressionHistorySerializer(data=data)
if serializer.is_valid():
serializer.save()
# DRF 序列化器 save() 为同步 ORM 操作,sync_to_async 兜底
await sync_to_async(serializer.save)()
return JsonResponse({
'success': True,
'data': serializer.data
@@ -62,22 +64,22 @@ class CompressionHistoryListView(APIView):
@permission_classes([AllowAny])
class CompressionHistoryDetailView(APIView):
def delete(self, request, pk):
async def delete(self, request, pk):
user = request.user if request.user.is_authenticated else None
session_id = request.query_params.get('session_id')
try:
if user:
history = CompressionHistory.objects.get(pk=pk, user=user)
history = await CompressionHistory.objects.aget(pk=pk, user=user)
elif session_id:
history = CompressionHistory.objects.get(pk=pk, session_id=session_id)
history = await CompressionHistory.objects.aget(pk=pk, session_id=session_id)
else:
return JsonResponse(
{'error': '无权限删除'},
status=status.HTTP_403_FORBIDDEN
)
history.delete()
await history.adelete()
return JsonResponse({'success': True})
except CompressionHistory.DoesNotExist:
return JsonResponse(
@@ -88,14 +90,14 @@ class CompressionHistoryDetailView(APIView):
@permission_classes([AllowAny])
class CompressionHistoryClearView(APIView):
def delete(self, request):
async def delete(self, request):
user = request.user if request.user.is_authenticated else None
session_id = request.query_params.get('session_id')
if user:
count, _ = CompressionHistory.objects.filter(user=user).delete()
count, _ = await CompressionHistory.objects.filter(user=user).adelete()
elif session_id:
count, _ = CompressionHistory.objects.filter(session_id=session_id).delete()
count, _ = await CompressionHistory.objects.filter(session_id=session_id).adelete()
else:
return JsonResponse(
{'error': '无权限清空'},