代码之家  ›  专栏  ›  技术社区  ›  Rohit

自定义渲染器中断站点

  •  0
  • Rohit  · 技术社区  · 8 年前

    我刚进入Django世界,几个月前刚开始我的第一个python工作(过去十年的php-dev)。我在一个端点上使用DjangoRESTAPI,在这里我需要返回一个XML字符串,但是从环顾四周看,似乎没有一个内置的呈现器允许您简单地传递一个字符串来按原样返回?我看到“httpresponse”有效,但“response”无效,一位同事告诉我“response”是更好的选择,可以创建一个渲染器。我认为基于源代码看起来很简单,基本上这是最简单的:

    class PassThroughRenderer(BaseRenderer):
        media_type = None
        format = None
    
        def render(self, data, accepted_media_type=None, renderer_context=None):
            return data
    

    我的视图(修剪了一点,但只有一些模型存储):

    def post(self, request):
        original_soap = request.body
        try:
            parsed_soap = xmltodict.parse(original_soap)
        except xml.parsers.expat.ExpatError:
            return Response(dicttoxml({'invalid_xml': True}), content_type='text/xml', status=422)
        parsed_soap = self.strip_sf_prefix(parsed_soap)
    
        config = yaml.load(settings.SALESFORCE_CRED)
        organization_id = config['organization_id']
    
        if parsed_soap['soapenv:Envelope']['soapenv:Body']['notifications']['OrganizationId'] != organization_id:
            return Response(dicttoxml({'unauthorized': True}), content_type='text/xml', status=401)
    
        return Response(SALESFORCE_RESPONSE, content_type='text/xml')
    

    不幸的是,当我运行时 renderer_classes = (utils.PassThroughRenderer,) 去我的观景课),我得到 'Request' object has no attribute 'accepted_renderer' 以及一个似乎没有击中我写的任何代码的回溯。

    我希望有人能帮我找出我哪里做错了?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Rohit    8 年前

    看起来我必须明确地设定 media_type 对非 None 价值。设置默认值(无论如何我都要覆盖它)允许渲染器运行。