如何快速在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里添加:
这样完全不需要处理CSRF,完美适配移动端请求!Authorization: Token 你的token字符串
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
相关产品推荐
相关产品推荐

