feat: ADRF async views (phase1) + native async serializers (phase2) + async cache infra
This commit is contained in:
+19
-17
@@ -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})
|
||||
|
||||
Reference in New Issue
Block a user