自定义渲染器中断站点

时间:2018-10-09 15:24:52

标签: python django django-rest-framework

我是DJango领域的新手,几个月前刚开始我的第一个Python工作(过去十年的PHP开发人员)。我在需要返回XML字符串的端点上使用Django REST API,但是从周围看,似乎没有内置的渲染器允许您简单地传递要按原样返回的字符串?

我看到`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,)添加到我的APIView类中)后,我得到了'Request' object has no attribute 'accepted_renderer'和一个回溯,它似乎没有达到我编写的任何代码。

1 个答案:

答案 0 :(得分:1)

好像我必须将media_type显式设置为非None值。设置默认值(无论如何我都将其覆盖)允许渲染器运行。