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
+19 -17
View File
@@ -1,7 +1,8 @@
import json
from rest_framework.views import APIView
from adrf.views import APIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.parsers import MultiPartParser, FormParser
from asgiref.sync import sync_to_async
from drf_yasg.utils import swagger_auto_schema
from drf_yasg import openapi
from user.models import UserDevice
@@ -25,7 +26,7 @@ class UploadCoverAPIView(APIView):
],
responses={200: success_response, 400: '参数错误', 401: unauthorized_response},
)
def post(self, request):
async def post(self, request):
cover_file = request.FILES.get('cover')
if not cover_file:
return create_standardized_error_response(
@@ -49,12 +50,13 @@ class UploadCoverAPIView(APIView):
user = request.user
if user.cover_image:
try:
user.cover_image.delete(save=False)
# FieldFile.delete 是同步存储 I/O,线程池兜底
await sync_to_async(user.cover_image.delete)(save=False)
except Exception:
pass
user.cover_image = cover_file
user.save(update_fields=['cover_image'])
await user.asave(update_fields=['cover_image'])
return create_standardized_response(
data={
@@ -73,7 +75,7 @@ class PrivacySettingsAPIView(APIView):
operation_description='获取当前用户的隐私设置',
responses={200: success_response, 401: unauthorized_response},
)
def get(self, request):
async def get(self, request):
user = request.user
return create_standardized_response(
data={
@@ -97,7 +99,7 @@ class PrivacySettingsAPIView(APIView):
),
responses={200: success_response, 400: '参数错误', 401: unauthorized_response},
)
def put(self, request):
async def put(self, request):
user = request.user
valid_choices = ['public', 'friends_only', 'private']
@@ -112,7 +114,7 @@ class PrivacySettingsAPIView(APIView):
)
setattr(user, field, value)
user.save(update_fields=fields)
await user.asave(update_fields=fields)
return create_standardized_response(
data={
'privacy_profile': user.privacy_profile,
@@ -132,7 +134,7 @@ class NotificationSettingsAPIView(APIView):
operation_description='获取当前用户的消息通知偏好设置',
responses={200: success_response, 401: unauthorized_response},
)
def get(self, request):
async def get(self, request):
user = request.user
return create_standardized_response(
data={
@@ -162,7 +164,7 @@ class NotificationSettingsAPIView(APIView):
),
responses={200: success_response, 401: unauthorized_response},
)
def put(self, request):
async def put(self, request):
user = request.user
fields = ['notify_email', 'notify_browser', 'notify_reply', 'notify_like', 'notify_follow', 'notify_system']
@@ -173,7 +175,7 @@ class NotificationSettingsAPIView(APIView):
value = str(value).lower() in ('true', '1', 'yes')
setattr(user, field, value)
user.save(update_fields=fields)
await user.asave(update_fields=fields)
return create_standardized_response(
data={
'notify_email': user.notify_email,
@@ -196,11 +198,11 @@ class UserDeviceListView(APIView):
operation_description='获取当前用户的所有登录设备列表',
responses={200: success_response, 401: unauthorized_response},
)
def get(self, request):
async def get(self, request):
user = request.user
devices = UserDevice.objects.filter(user=user).order_by('-last_active')
data = []
for d in devices:
async for d in devices:
data.append({
'id': d.id,
'device_name': d.device_name,
@@ -228,9 +230,9 @@ class UserDeviceRemoveView(APIView):
],
responses={200: success_response, 404: '设备不存在', 401: unauthorized_response},
)
def delete(self, request, pk):
async def delete(self, request, pk):
user = request.user
device = UserDevice.objects.filter(user=user, pk=pk).first()
device = await UserDevice.objects.filter(user=user, pk=pk).afirst()
if not device:
return create_standardized_error_response(
code=40401,
@@ -241,7 +243,7 @@ class UserDeviceRemoveView(APIView):
code=40001,
message='不能移除当前设备'
)
device.delete()
await device.adelete()
return create_standardized_response(data={'message': '设备已移除'})
@@ -254,7 +256,7 @@ class UserDeviceClearOthersView(APIView):
operation_description='移除除当前设备外的所有其他登录设备',
responses={200: success_response, 401: unauthorized_response},
)
def post(self, request):
async def post(self, request):
user = request.user
count, _ = UserDevice.objects.filter(user=user).exclude(is_current=True).delete()
count, _ = await UserDevice.objects.filter(user=user).exclude(is_current=True).adelete()
return create_standardized_response(data={'message': f'已移除 {count} 个设备', 'removed_count': count})