我的Django REST API有这个类用于身份验证:
class AuthView(APIView):
authentication_classes = (BasicAuthentication,)
def post(self, request, *args, **kwargs):
login(request, request.user)
data = {'testkey':'testvalue'}
return HttpResponse(json.dumps(data), content_type="application/json")
当凭证正确时,控制将发布方法(这很好)。 但是,对于不正确的凭据,有人可以解释为什么控制没有进入post方法吗?
我想为未经身份验证的请求设置一个自定义HTTP状态代码,(不能在帖子内执行此操作,因为对于未经身份验证的请求,控件不在那里)并且我正在寻找一种正确的方法来执行此操作。
答案 0 :(得分:1)
Control永远不会输入您的POST方法,因为Django Rest Framework(您在此处使用)将首先使用您指定的authentication_classes
对传入的请求进行身份验证,然后再输入post
方法(或{{ 1}}等等 - 取决于请求。)
您在此处使用的get
类throws an exception when credentials are incorrect(这是Django Rest Framework的工作方式,documented here)。
这会停止执行流程(因此它永远不会到达您的方法),并提前返回错误代码。
现在,实现此功能的实际代码位于APIView.dispatch
中,在发出请求时会调用它。 BasicAuthentication
调用是最终调用身份验证代码的调用,而调用self.initial()
方法的调用是post
行(稍后会发生,如您所见)。< / p>
为了回答你问题的第二部分,Django Rest Framework非常注重应该如何完成事情,但你可以通过定义自己的身份验证类来自定义状态代码,但我对此表示怀疑。
答案 1 :(得分:0)
最后,我扩展了BasicAuthentication并覆盖了authenticate_credentials方法,如下所示:
from rest_framework.authentication import BasicAuthentication
from django.contrib.auth import authenticate
class CustomAuth(BasicAuthentication):
def authenticate_credentials(self, userid, password):
"""
Override authenticate_credentials(..) of BasicAuthentication
"""
user = authenticate(username=userid, password=password)
'''if user is None or not user.is_active:
raise exceptions.AuthenticationFailed('Invalid username/password')'''
return (user, None)
现在似乎工作正常。 但是,我不确定这是否是最好的方法!
答案 2 :(得分:-1)
基本身份验证通常由浏览器实现。如果身份验证通过,我希望他们只提交帖子。