我有一个用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.'}
如果我使用网络浏览器浏览任何其他页面,它只是在弹出窗口中要求输入用户名/密码并记住它一段时间。因此,在我使用渲染器回到我的页面后,在另一页面上进行授权后,它可以正常工作。
为什么它的行为不像其他页面?如何像所有其他页面一样询问用户名/密码?
答案 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