使用Django Rest框架进行令牌认证

时间:2018-12-05 09:02:53

标签: django django-rest-framework

This is output我正在尝试使用HTTPIE从api端点获取数据,以下是命令,

http http://127.0.0.1:8000/hello/ 'Authorization: Token c9a5b630b1887efdd3ca2db82aae9cec2c44257e'

我生成了令牌并将其附加到api端点,我也使用curl来获取数据,但是它显示了类似的错误。

Views.py

from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated


class HelloView(APIView):
   permission_classes = (IsAuthenticated,)

   def get(self,request):
     content = {'message': 'Hello'}
     return Response(content)

settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'core',
    'rest_framework',
    'rest_framework.authtoken',
]

REST_FRAMEWORK = {
   'DEFAULT_AUTHENTICATION_CLASSES': [
       'rest_framework.authentication.TokenAuthentication',
       'rest_framework.authentication.SessionAuthentication',
   ],
}

输出

usage: http [--json] [--form] [--pretty {all,colors,format,none}]
            [--style STYLE] [--print WHAT] [--headers] [--body] [--verbose]
            [--all] [--history-print WHAT] [--stream] [--output FILE]
            [--download] [--continue]
            [--session SESSION_NAME_OR_PATH | --session-read-only SESSION_NAME_OR_PATH]
            [--auth USER[:PASS]] [--auth-type {basic,digest}]
            [--proxy PROTOCOL:PROXY_URL] [--follow]
            [--max-redirects MAX_REDIRECTS] [--timeout SECONDS]
            [--check-status] [--verify VERIFY]
            [--ssl {ssl2.3,ssl3,tls1,tls1.1,tls1.2}] [--cert CERT]
            [--cert-key CERT_KEY] [--ignore-stdin] [--help] [--version]
            [--traceback] [--default-scheme DEFAULT_SCHEME] [--debug]
            [METHOD] URL [REQUEST_ITEM [REQUEST_ITEM ...]]
http: error: argument REQUEST_ITEM: "Token" is not a valid value

5 个答案:

答案 0 :(得分:2)

您可以尝试使用curl甚至邮递员发出请求,看看它是否有效,

curl -X GET http://127.0.0.1:8000/hello/ -H "Authorization: Token Your generated token here"

或者使用邮递员,将令牌传递到请求标头上,如下所示:

enter image description here

不要忘记使用命令生成令牌

python manage.py drf_create_token YOURUSER

答案 1 :(得分:0)

确定要为http调用设置标头吗?

--headers

这是API文档中的示例:

curl -X GET http://127.0.0.1:8000/api/example/ -H 'Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b'

答案 2 :(得分:0)

由于使用Windows,因此应使用双引号将Authorization标头包含在内。 Windows(特别是cmd.exe)无法识别单引号,并将标头的每个部分都视为一个单独的参数。

因此更改为:

http http://127.0.0.1:8000/hello/ "Authorization: Token c9a5b630b1887efdd3ca2db82aae9cec2c44257e"

答案 3 :(得分:0)

解决方案很简单,如下所示。与DRF Documentation 所说的

相反,使用双引号代替单引号

要卷曲,请使用以下命令

curl -H "Authorization: Token c9a5b630b1887efdd3ca2db82aae9cec2c44257e" http://127.0.0.1:8000/hello/

对于HTTPie使用

http GET http://127.0.0.1:8000/hello/ "Authorization: Token c9a5b630b1887efdd3ca2db82aae9cec2c44257e"

请注意,在文档中使用双引号与单引号相反。

答案 4 :(得分:0)

当我将 cmd 切换到 windows 10.bash 时,问题本身就解决了。