Django(1.10)视图内生成JWT Token的实现方法求助
在Django 1.10 + DRF视图内生成JWT Token的解决方案
首先,先确认你已经安装了djangorestframework-jwt包——DRF本身并不自带JWT功能,需要这个第三方包来实现,如果还没装,先执行:
pip install djangorestframework-jwt
1. 完善settings.py里的DRF配置
把你现有的REST_FRAMEWORK配置补全,添加JWT认证类:
# 记得先导入datetime模块 from datetime import timedelta REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.DjangoObjectPermissions' ], 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', # 如果你还需要会话认证(比如后台调试用),可以保留这一行 'rest_framework.authentication.SessionAuthentication', ) } # 可选:配置JWT的自定义参数,比如有效期、是否允许刷新等 JWT_AUTH = { 'JWT_EXPIRATION_DELTA': timedelta(days=7), # 设置Token有效期为7天 'JWT_ALLOW_REFRESH': True, # 允许用户刷新Token延长有效期 }
2. 在视图内生成JWT Token的两种常用方法
方式一:给已认证用户生成Token
如果用户已经通过其他方式(比如会话登录、第三方认证)完成了身份验证,你可以直接调用JWT的工具函数为当前用户生成Token:
from rest_framework_jwt.settings import api_settings from rest_framework.response import Response from rest_framework import status def your_custom_view(request): # 确保request.user是已通过认证的用户实例 if request.user.is_authenticated: # 获取JWT的核心处理函数 jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER # 生成Token的载荷信息 payload = jwt_payload_handler(request.user) # 加密生成最终Token token = jwt_encode_handler(payload) # 将Token返回给客户端 return Response({'token': token}, status=status.HTTP_200_OK) else: return Response({'error': 'User not authenticated'}, status=status.HTTP_401_UNAUTHORIZED)
方式二:通过用户名密码直接生成Token(自定义登录场景)
如果需要在视图里直接验证用户名密码并生成Token(比如做自定义登录接口),可以这样写:
from django.contrib.auth import authenticate from rest_framework_jwt.settings import api_settings from rest_framework.response import Response from rest_framework import status def custom_login_view(request): # 从请求数据中获取用户名和密码 username = request.data.get('username') password = request.data.get('password') # 验证用户 credentials user = authenticate(username=username, password=password) if user is not None: # 验证成功,生成Token jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER payload = jwt_payload_handler(user) token = jwt_encode_handler(payload) return Response({'token': token}, status=status.HTTP_200_OK) else: # 验证失败,返回错误信息 return Response({'error': 'Invalid username or password'}, status=status.HTTP_401_UNAUTHORIZED)
额外提示
- 如果你用了自定义用户模型,要确保JWT的载荷处理函数能识别你的用户字段,必要时可以自定义
JWT_PAYLOAD_HANDLER来扩展载荷信息。 - 如果你需要默认的JWT登录接口,也可以直接在
urls.py中添加官方提供的路由:
from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [ # ... 你的其他路由 path('api/auth/login/', obtain_jwt_token), ]
内容的提问来源于stack exchange,提问作者Abdul Rehman
相关产品推荐
相关产品推荐

