You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何快速在Django Rest Framework中切换并实现Token认证?

切换到Token-based Authentication的分步指南

嘿,我刚帮好几个开发者搞定过这个问题,别慌,切换流程其实很清晰,一步步来就能快速搞定:

1. 配置项目settings

首先打开你的settings.py,先把Token认证的应用加进INSTALLED_APPS:

INSTALLED_APPS = [
    # 其他已有的应用...
    'rest_framework',
    'rest_framework.authtoken',  # 新增这一行
]

然后在settings里配置DRF的认证类,把TokenAuthentication设为默认(也可以和SessionAuth共存,方便网页端调试):

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
        # 如果还需要保留Session认证给网页用,可以加上下面这行
        # 'rest_framework.authentication.SessionAuthentication',
    ],
    # 可选:设置默认权限,要求登录才能访问接口
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ]
}

2. 创建Token数据表

DRF的Token认证需要存储token的关联表,运行迁移命令自动创建:

python manage.py makemigrations
python manage.py migrate

这会生成authtoken_token表,用来绑定用户和他们的专属token。

3. 配置登录接口(获取Token)

DRF自带了现成的登录视图,能验证账号密码并返回token,你只需要在urls.py里添加路由:

from rest_framework.authtoken import views

urlpatterns = [
    # 其他已有的路由...
    path('api/login/', views.obtain_auth_token, name='api_login'),
]

这个接口接受POST请求,参数传username和password,验证通过后会返回包含token的JSON响应。

小技巧:自定义登录返回内容

如果默认接口只返回token不够用(比如想同时返回用户ID、昵称),可以自定义视图扩展功能:

# 在你的views.py中编写
from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.response import Response
from rest_framework import status
from rest_framework.authtoken.models import Token

class CustomAuthToken(ObtainAuthToken):
    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data, context={'request': request})
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token, created = Token.objects.get_or_create(user=user)
        return Response({
            'token': token.key,
            'user_id': user.pk,
            'username': user.username,
            'email': user.email
        }, status=status.HTTP_200_OK)

然后在urls.py里替换成自定义视图:

from .views import CustomAuthToken

urlpatterns = [
    # ...
    path('api/login/', CustomAuthToken.as_view(), name='api_login'),
]

4. 测试接口(解决Postman的CSRF问题)

现在用Postman测试流程:

  • 发送POST请求到http://你的域名/api/login/,Body选form-data或raw JSON,传入username和password
  • 成功后会拿到token,之后所有需要认证的接口,只需要在Headers里添加:
    Authorization: Token 你的token字符串
    
    这样完全不需要处理CSRF,完美适配移动端请求!

5. 给已有用户生成Token(可选)

如果数据库里已经有存量用户,想批量给他们生成token,可以用Django Shell:

python manage.py shell

然后执行:

from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token

for user in User.objects.all():
    Token.objects.get_or_create(user=user)

这样所有老用户都有了可用的token。


内容的提问来源于stack exchange,提问作者codelearner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:38:04