Django中如何在注册接口同时返回邮箱与Simple-JWT令牌
注册接口返回邮箱+JWT Access Token方案
下面是基于Django和Simple-JWT实现注册成功后直接返回邮箱与访问令牌的完整代码:
1. 用户模型(models.py)
如果用Django默认用户模型,无需改动;自定义模型的话确保继承AbstractUser,示例如下(默认模型):
from django.contrib.auth.models import User
2. 重写注册序列化器(serializers.py)
核心是在创建用户后生成JWT令牌,直接返回所需字段:
from rest_framework import serializers from django.contrib.auth.models import User from rest_framework_simplejwt.tokens import AccessToken class RegisterSerializer(serializers.ModelSerializer): password = serializers.CharField(write_only=True, required=True) class Meta: model = User fields = ('username', 'email', 'password') def create(self, validated_data): # 创建用户实例 user = User.objects.create_user( username=validated_data['username'], email=validated_data['email'], password=validated_data['password'] ) # 生成Access Token access_token = AccessToken.for_user(user) # 返回包含邮箱和令牌的字典 return { 'email': user.email, 'access_token': str(access_token) }
3. 注册视图(views.py)
用CreateAPIView快速实现注册接口:
from rest_framework.generics import CreateAPIView from .serializers import RegisterSerializer class RegisterView(CreateAPIView): serializer_class = RegisterSerializer
4. URL配置(urls.py)
添加注册路由,同时保留Simple-JWT默认的令牌接口(可选):
from django.urls import path from .views import RegisterView from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView urlpatterns = [ path('register/', RegisterView.as_view(), name='user-register'), # 保留默认令牌接口(如需单独获取令牌可保留) path('token/', TokenObtainPairView.as_view(), name='token-obtain-pair'), path('token/refresh/', TokenRefreshView.as_view(), name='token-refresh'), ]
测试验证
发送POST请求到/register/,请求体JSON:
{ "username": "newuser", "email": "new@example.com", "password": "SecurePass123!" }
成功响应会返回:
{ "email": "new@example.com", "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE5MjQwNzY1LCJpYXQiOjE3MTkyNDA0NjUsImp0aSI6Ij...", }
额外配置说明
确保settings.py中已配置Simple-JWT作为默认认证方式:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework_simplejwt.authentication.JWTAuthentication', ], }
内容的提问来源于stack exchange,提问作者Bte Deni
相关产品推荐
相关产品推荐

