我已经把头撞了过去差不多3-4天了。
让我解释一下情况。我有一个带有自定义身份验证类的DRF(Django REST Framework)类视图。据我所知,您可以覆盖DRF的BaseAuthentication类的authenticate方法来实现自定义身份验证,而如果身份验证失败,您只能引发DRF提供的预定义Exceptions。
我的问题是,我正试图找到一种方法来返回自定义响应,即;直接从身份验证类到前端的验证码HTML,以便在我的视图中不实现与身份验证相关的代码。
为了更好地了解我的情况,我在下面提供一个伪代码。
class ExampleView(APIView):
authentication_classes = (ExampleCustomAuth, )
def get(self, request):
pass
这是视图,这部分绝对没问题。
class ExampleCustomAuth(BaseAuthentication):
def authenticate(self, request):
req = request
request = req._request
{
This part of code decides if its required for a
captcha or not
}
if captcha_required:
response = HttpResponse()
response.status_code = 401
response['WWW-Authenticate'] = 'Captcha" id="%s"'% (id)
response.content = loader.render_to_string('captcha.html')
return response # This is where it goes wrong
我相信,不可能从这里返回回复。
我希望有人找到解决方法。
提前谢谢!
答案 0 :(得分:1)
好吧,我终于找到了让它运转的方法。
根据DRF docs,应该为任何身份验证逻辑覆盖authenticate方法,并且还必须覆盖authenticate_header,这样如果在authenticate方法中引发异常,则可以从authenticate_header方法返回一个字符串,它将用作www-Authenticate标题的值。
以下是实施的工作原理。
class ExampleCustomAuth(BaseAuthentication):
def authenticate(self, request):
req = request
request = req._request
{
This part of code decides if its required for a
captcha or not
}
if captcha_required:
raise exceptions.AuthenticationFailed(loader.render_to_string('captcha.html'))
def authenticate_header(self, request):
return 'Captcha" id="%s"'% (id)