Django url 调度错误 - 属性错误:'WSGIRequest'对象没有属性'data'



我根据类中方法的路径进行调度。当我必须将它传递给post方法时,问题就出现了。否则,我可以使用process_Request方法将其封装在Request上。

如何将正确的请求传递给方法这不是HttpRequest,而是DRF3 Request。

class AddInvoice(APIView):
@staticmethod
def process_request(request, *args, **kwargs):
if isinstance(request, HttpRequest):
return Request(request,parsers=[MultiPartParser, FormParser, JSONParser, DjangoMultiPartParser])
return request
parser_classes = (MultiPartParser, FormParser, JSONParser, DjangoMultiPartParser, FileUploadParser)
def dispatch(self, request, *args, **kwargs):
response = None
#request = AddInvoice.process_request(request, *args, **kwargs)
if request.method == 'PUT':
if request.path.rstrip('/') == '/invoice/digitize':
response = self.digitize(request,*args, **kwargs)
elif request.method == 'GET':
if request.path.startswith('/invoice/isdigitized/'):
response = self.isdigitized(request, *args,
**kwargs)
elif request.path.startswith('/invoice/get/'):
response = self.get(request, *args, **kwargs)
elif request.method == 'POST':
if request.path.rstrip('/') == '/invoice':
response = self.post(request, *args, **kwargs)
if not response:
response = Response(status=status.HTTP_406_NOT_ACCEPTABLE)
if not getattr(request, 'accepted_renderer', None):
neg = self.perform_content_negotiation(request, force=True)
request.accepted_renderer, request.accepted_media_type = neg
response.accepted_renderer = request.accepted_renderer
response.accepted_media_type = request.accepted_media_type
response.renderer_context = self.get_renderer_context()
return response

我使用了一些替代方法来绕过创建APIView类作为对象并使用它add_invoice = AddInvoice()的问题,并获得替代解决方案。Django一直不太友善,没有其他选择可以将其转换为DRF3Request。

@staticmethod
@api_view(["GET", 'PUT', "POST"])
def dispatch(request, *args, **kwargs):
response = None
add_invoice = AddInvoice()
if request.method == 'PUT':
if request.path.rstrip('/') == '/invoice/digitize':
response = add_invoice.digitize(request, *args, **kwargs)
elif request.method == 'GET':
if request.path.startswith('/invoice/isdigitized/'):
response = add_invoice.isdigitized(request, *args,
**kwargs)
elif request.path.startswith('/invoice/get/'):
response = add_invoice.get(request, *args, **kwargs)
elif request.method == 'POST':
if request.path.rstrip('/') == '/invoice':
response = add_invoice.post(request)
if not response:
response = Response(status=status.HTTP_406_NOT_ACCEPTABLE)
if not getattr(request, 'accepted_renderer', None):
neg = add_invoice.perform_content_negotiation(request, force=True)
request.accepted_renderer, request.accepted_media_type = neg
response.accepted_renderer = request.accepted_renderer
response.accepted_media_type = request.accepted_media_type
response.renderer_context = add_invoice.get_renderer_context()
return response

最新更新