Django 2.0自定义rest_auth接口返回响应格式方法问询
嘿,这个需求我之前也碰到过,其实通过重写rest_auth的序列化器就能轻松搞定,具体步骤我给你理清楚:
自定义rest_auth登录/注册响应格式的实现方法
1. 编写自定义Token序列化器
首先在你的项目某个专门处理用户逻辑的app(比如accounts)里新建一个serializers.py文件,重写默认的Token序列化器,把嵌套的user字段拆成顶层字段,同时添加自定义字段:
from rest_auth.serializers import TokenSerializer from django.contrib.auth import get_user_model from rest_framework import serializers # 获取项目的User模型 User = get_user_model() class CustomTokenSerializer(TokenSerializer): # 把user对象里的字段直接提取到响应顶层 pk = serializers.ReadOnlyField(source='user.pk') username = serializers.ReadOnlyField(source='user.username') # 这里添加你的自定义字段,source要对应User模型里的实际字段路径 somefield = serializers.ReadOnlyField(source='user.somefield') class Meta: # 继承原TokenSerializer的模型配置 model = TokenSerializer.Meta.model # 指定返回的字段列表和顺序 fields = ('token', 'pk', 'username', 'somefield')
2. 配置settings让rest_auth使用自定义序列化器
打开项目的settings.py,添加下面的配置,告诉rest_auth替换掉默认的序列化器:
REST_AUTH_SERIALIZERS = { 'TOKEN_SERIALIZER': 'accounts.serializers.CustomTokenSerializer', # 这里的路径要和你实际的serializers文件路径保持一致 }
3. (可选)处理注册接口的响应格式
如果你连注册成功后的响应也要改成目标格式,那还要重写注册相关的序列化器。继续在serializers.py里补充代码:
from rest_auth.registration.serializers import RegisterSerializer # 重写注册序列化器(如果注册时需要接收somefield参数的话) class CustomRegisterSerializer(RegisterSerializer): # 注册时需要传入的自定义字段,用write_only=True避免返回该字段 somefield = serializers.CharField(write_only=True) def get_cleaned_data(self): # 继承父类的字段清理逻辑,同时把自定义字段加入清理后的数据 cleaned_data = super().get_cleaned_data() cleaned_data['somefield'] = self.validated_data.get('somefield', '') return cleaned_data # 注册成功后返回用户信息的序列化器 class CustomUserDetailsSerializer(serializers.ModelSerializer): class Meta: model = User fields = ('pk', 'username', 'somefield')
接着去settings.py里添加注册相关的配置:
REST_AUTH_REGISTER_SERIALIZERS = { 'REGISTER_SERIALIZER': 'accounts.serializers.CustomRegisterSerializer', 'USER_DETAILS_SERIALIZER': 'accounts.serializers.CustomUserDetailsSerializer', }
4. 测试效果
重启你的Django服务,调用登录或者注册接口,就能得到你想要的响应格式了:
{ "token": "foo_token", "pk": 1, "username": "admin", "somefield": "Foo Funk" }
小提示:如果somefield不是User模型自带的字段,你得先给User模型添加这个字段;如果字段存在于关联模型中,就把source改成对应的路径,比如source='user.profile.somefield'。
内容的提问来源于stack exchange,提问作者Alex D
相关产品推荐
相关产品推荐

