尝试从rest框架中检索令牌时的302状态代码

时间:2014-02-05 00:12:46

标签: django curl django-rest-framework

我正在尝试通过django rest框架检索令牌 我的api.views.py看起来像这样

from rest_framework.views import APIView
from rest_framework import status
from rest_framework import parsers
from rest_framework import renderers
from rest_framework.response import Response
from rest_framework.authtoken.models import Token
from rest_framework.authtoken.serializers import AuthTokenSerializer


class ObtainAuthToken(APIView):
    throttle_classes = ()
    permission_classes = ()
    parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
    renderer_classes = (renderers.JSONRenderer,)
    serializer_class = AuthTokenSerializer
    model = Token

    def post(self, request):
        serializer = self.serializer_class(data=request.DATA)
        if serializer.is_valid():
            token, created = Token.objects.get_or_create(user=serializer.object['user'])
            return Response({'token': token.key})
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我的网址如下:

url(r'^api-token-auth/$', ObtainAuthToken.as_view())

当我请求身份验证令牌时,我没有得到响应,我得到302状态代码 我用curl请求令牌:

curl -X POST -d "username=admin&password=pass" http://localhost:8000/api-token-auth/

我被重定向了吗?任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:1)

您是否已从djangos docs检查APPEND_SLASH的值以查看是否正在执行此操作:

https://docs.djangoproject.com/en/dev/ref/settings/#append-slash

  

默认值:True

     

如果设置为True,如果请求URL与URLconf中的任何模式都不匹配且它不以斜杠结尾,则会向相同的URL发出HTTP重定向并附加斜杠。 >请注意,重定向可能会导致POST请求中提交的任何数据丢失。

     

APPEND_SLASH设置仅在安装了CommonMiddleware时使用

要检查的另一件事是您正在使用curl,请尝试以下命令:

curl --data "username=xxx&password=xxx" http://localhost:8000/api/token-auth/

除了文档之外:

http://www.django-rest-framework.org/api-guide/authentication#tokenauthentication

我们可以通过在您的网址模式中添加以下内容来保持一点清洁:

urlpatterns += patterns('',
    url(r'^api-token-auth/', 'rest_framework.authtoken.views.obtain_auth_token')
)

它还在该页面上进一步说明:

  

如果您需要自定义版本的obtain_auth_token视图,可以通过覆盖ObtainAuthToken视图类并在您的url conf中使用它来实现。

你可以通过做这样的事情来做到这一点:

from rest_framework.authtoken.views import ObtainAuthToken

class ModifiedObtainAuthToken(ObtainAuthToken):
    pass

modified_obtain_auth_token = ModifiedObtainAuthToken.as_view()

然后添加如下内容:

urlpatterns += patterns('',
    url(r'^api-token-auth/', 'yourapp.views.modified_obtain_auth_token')
)