Django Rest Framework - 使用渲染器

时间:2018-01-03 21:44:06

标签: django django-rest-framework basic-authentication restful-authentication

我有一个用DRF编写的小型公司Web服务。它使用基本身份验证,所以我在我的设置中有这个:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication'
    ),
    'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated',),
}

当我浏览任何页面时,默认情况下会提供一个基本弹出窗口,要求输入用户名/密码。它适合我的需要,因为我没有处理登录表单等等,我只需要非常基本的身份验证。在我开始创建渲染器之前,这一切都很有效:

class MyRenderer(BaseRenderer):
    def render(self, data, media_type=None, renderer_context=None):
        logging.debug(data)
        return data

此时它会在日志中打印:

{u'detail': u'Authentication credentials were not provided.'}

如果我使用网络浏览器浏览任何其他页面,它只是在弹出窗口中要求输入用户名/密码并记住它一段时间。因此,在我使用渲染器回到我的页面后,在另一页面上进行授权后,它可以正常工作。

为什么它的行为不像其他页面?如何像所有其他页面一样询问用户名/密码?

2 个答案:

答案 0 :(得分:1)

您可能已经从视图中清除了身份验证类,同时保留了IsAuthenticated权限。 确保从视图中清除权限类。

答案 1 :(得分:0)

我不确定为什么但经过一次小改动之后才能正常工作 - 它要求输入用户名/密码,而不是马上回复401回复。

我的旧代码:

class MyRenderer(BaseRenderer):
    def render(self, data, media_type=None, renderer_context=None):
        self.instrument_id = data['meta']['instrument_id']
        ... # more custom code

我的新代码:

class MyRenderer(BaseRenderer):
    def render(self, data, media_type=None, renderer_context=None):
        if 'meta' not in data:
            return str(data)
        self.instrument_id = data['meta']['instrument_id']
        ... # more custom code