如何从Django rest框架的自定义Authentication类返回自定义响应对象

时间:2016-10-19 11:29:55

标签: django authentication django-rest-framework captcha

我已经把头撞了过去差不多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

我相信,不可能从这里返回回复。

我希望有人找到解决方法。

提前谢谢!

1 个答案:

答案 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)