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

如何在Django REST Framework的Djoser中创建用户后返回JSON Web Token并实现自定义UserCreateSerializer

解决Djoser注册后返回JWT的问题

嘿,我来帮你搞定这个需求!要让Djoser在用户注册完成后返回JWT,我们需要用SerializerMethodField来动态生成token(毕竟用户创建前token还不存在,没法直接定义静态字段),再配合DRF的SimpleJWT库来生成令牌。下面是一步步的实现方案:

步骤1:确保依赖安装

首先确认你已经安装了djangorestframework-simplejwt(Djoser官方推荐的JWT库),如果没装的话执行:

pip install djangorestframework-simplejwt

步骤2:修改序列化器

更新你的UserCreateSerializer,添加动态生成token的逻辑:

from djoser.serializers import UserCreateSerializer as BaseUserCreateSerializer
from rest_framework import serializers
from rest_framework_simplejwt.tokens import RefreshToken

class UserCreateSerializer(BaseUserCreateSerializer):
    # 用SerializerMethodField来动态生成token字段
    token = serializers.SerializerMethodField()

    class Meta(BaseUserCreateSerializer.Meta):
        fields = ['id', 'username', 'password', 'email', 'first_name', 'last_name', 'token']

    # 定义生成token的方法,obj是刚创建的用户实例
    def get_token(self, obj):
        refresh = RefreshToken.for_user(obj)
        # 返回包含refresh和access令牌的字典,也可以只返回access
        return {
            'refresh': str(refresh),
            'access': str(refresh.access_token),
        }

步骤3:配置Djoser和JWT

在项目的settings.py里添加相关配置,告诉Djoser使用我们的自定义序列化器和SimpleJWT:

INSTALLED_APPS = [
    # 其他已有的app
    'djoser',
    'rest_framework_simplejwt',
]

# Djoser配置
DJOSER = {
    'SERIALIZERS': {
        # 指定我们自定义的用户创建序列化器
        'user_create': '你的应用名.serializers.UserCreateSerializer',
    },
    # 指定使用SimpleJWT的token模型
    'TOKEN_MODEL': 'rest_framework_simplejwt.tokens.AccessToken',
}

# DRF认证配置
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
}

原理说明

  • SerializerMethodField:专门用来处理需要动态生成的字段,它会自动调用get_<字段名>方法(这里就是get_token),传入的obj就是刚创建成功的用户实例。
  • RefreshToken.for_user(obj):SimpleJWT提供的方法,根据用户实例生成一对刷新令牌(refresh)和访问令牌(access)——前端可以用access令牌做接口认证,用refresh令牌获取新的access令牌,避免用户频繁登录。

这样配置完成后,当用户发送POST请求到Djoser的默认注册端点(通常是/auth/users/),创建成功后返回的JSON响应就会包含token字段,格式大致如下:

{
    "id": 1,
    "username": "testuser",
    "email": "test@example.com",
    "first_name": "",
    "last_name": "",
    "token": {
        "refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
        "access": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
    }
}

如果你只需要返回access令牌,直接修改get_token方法返回str(refresh.access_token)即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 13:37:43