找个地方重写APIView的dispatch方法,示例:
apps.common.views.AAPIView
from asgiref.sync import sync_to_asyncfrom rest_framework.views import APIViewclass AAPIView(APIView):"""Async ApiView@seehttps://github.com/encode/django-rest-framework/pull/8617/commits/79ce07ba9b0d46cb7c0c592ef47e7f834f651df4#diff-b750fc158f144a0a00aab378a20b42038ed6c59f4b80f533331f3c682e76cb06R2https://github.com/em1208/adrf"""async def async_dispatch(self, request, *args, **kwargs):self.args = argsself.kwargs = kwargsrequest = self.initialize_request(request, *args, **kwargs)self.request = requestself.headers = self.default_response_headers # deprecate?try:await sync_to_async(self.initial)(request, *args, **kwargs)# Get the appropriate handler methodif request.method.lower() in self.http_method_names:handler = getattr(self, request.method.lower(),self.http_method_not_allowed)else:handler = self.http_method_not_allowedresponse = await handler(request, *args, **kwargs)except Exception as exc:response = self.handle_exception(exc)self.response = self.finalize_response(request, response, *args, **kwargs)return self.responsedef dispatch(self, request, *args, **kwargs):return self.async_dispatch(request, *args, **kwargs)
在正式使用时,在原有的继承中,额外继承Async APIVIew,示例:
apps.target_manager.views
from asgiref.sync import sync_to_asyncimport timefrom rest_framework import genericsfrom rest_framework.response import Responsefrom apps.common.views import AAPIViewfrom . import serializers as target_serializersasync def test_sleep():await sync_to_async(time.sleep, thread_sensitive=False)(5)print('helloworld')class TargetBaseInfoView(generics.CreateAPIView, AAPIView):serializer_class = target_serializers.DemoSerializerasync def post(self, request, *args, **kwargs):asyncio.create_task(test_sleep())return Response({'method': 'POST'})
apps.target_manager.serializers
from rest_framework import serializersclass DemoSerializer(serializers.Serializer):urls = serializers.ListField(help_text='待扫描的URL列表')

将数据处理逻辑放在序列化层
from asgiref.sync import sync_to_asyncimport asyncioimport timefrom rest_framework import serializersasync def test_sleep():await sync_to_async(time.sleep, thread_sensitive=False)(5)print('helloworld')class DemoSerializer(serializers.Serializer):urls = serializers.ListField(child=serializers.CharField(),help_text='待扫描的URL列表')def create(self, validated_data):asyncio.create_task(test_sleep())return validated_data
from rest_framework import genericsfrom . import serializers as target_serializersfrom apps.common.views import AAPIViewfrom rest_framework.response import Responseclass TargetBaseInfoView(generics.ListCreateAPIView, AAPIView):serializer_class = target_serializers.DemoSerializerasync def get(self, request, *args, **kwargs):return Response({'method': 'GET'})async def post(self, request, *args, **kwargs):return super().post(request, *args, **kwargs)
