【问题标题】:Django url dispatch error - AttributeError: 'WSGIRequest' object has no attribute 'data'Django url 调度错误 - AttributeError: 'WSGIRequest' 对象没有属性 'data'
【发布时间】:2021-03-08 21:04:25
【问题描述】:

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

如何将正确的请求传递给方法 这不是 HttpRequest 而是我想的 DRF 3 请求。

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

【问题讨论】:

    标签: django


    【解决方案1】:

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

    @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
    

    【讨论】:

      猜你喜欢
      • 2021-04-30
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 2021-07-04
      • 2016-02-02
      • 1970-01-01
      • 2022-01-21
      • 2018-09-06
      相关资源
      最近更新 更多