问题不在代码中,奇怪的是,我只需要重新运行Django服务器,代码就会按预期执行,所以B.views.py
将是:
from rest_framework import views
from rest_framework.response import Response
from A.views import A
class B(views.APIView):
def post(self, request, *args, **kwargs):
http_response = A.as_view()(request._request)
return Response(http_response.data)
UPDATE个
似乎HttpRequest
AKA request._request
在被Django REST FrameworkView
解析器类读取后不能被多次使用,这将导致调用read
方法,这将把_request
对象的属性_read_started
更改为True
,之后如果您试图使用request.data
或request._request
将引发上面所示的异常,因为request.body
不再是可访问的,因为它依赖于_read_started
属性的值,更不用说HttpRequest
的值已经被转换成stream
对象并存储在内存中.
SOLUTION个
我发现了多个建议:
1-使用Middleware
存储request.body
,以备将来需要时使用.
2-使用自定义解析器类,在将原始数据转换为stream
对象之前,将原始数据作为属性存储在request
对象中.
我发现它们都有点复杂,所以我更改了从特定DRF View
呼叫另一个APIView
的方式,如下所示:
from rest_framework import views, status
from rest_framework.response import Response
from A.views import A
from C.views import C
class B(views.APIView):
def post(self, request, *args, **kwargs):
# Initialize a new instance of class view 'A'
a_view = A()
# Calling HTTP 'POST' method with DRF request object.
a_http_response = a_view.post(request)
if a_http_response.status_code == status.status.HTTP_200_OK:
# Initialize a new instance of class view 'C'
c_view = C()
# Another calling HTTP 'POST' method with DRF request object.
c_http_response = c_view.post(request)
return(c_http_response.data)
else:
return Response(a_http_response.data)