我是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'
和一个回溯,它似乎没有达到我编写的任何代码。
答案 0 :(得分:1)
好像我必须将media_type
显式设置为非None
值。设置默认值(无论如何我都将其覆盖)允许渲染器运行。