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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:25:08