Django REST框架自定义令牌(带有令牌访问和求章的用户对象)

发布于 2025-02-12 08:50:57 字数 1642 浏览 0 评论 0原文

我正在尝试创建一个自定义令牌,以将用户对象与访问和刷新一起发送。

注意:如果还有另一种方法,请告诉我。从头开始启动令牌代码是一个选择。

token_serializer.py

from rest_framework_simplejwt.serializers import (
    TokenObtainSerializer,
    RefreshToken,
    api_settings,
    update_last_login,
)
from django.core import serializers
from app.models.user import AppUser


class TokenSerializer(TokenObtainSerializer):
    @classmethod
    def get_token(cls, user):
        return RefreshToken.for_user(user)

    def validate(self, attrs):
        data = super().validate(attrs)

        refresh = self.get_token(self.user)

        data["refresh"] = str(refresh)
        data["access"] = str(refresh.access_token)

        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        serialized_app_user = serializers.serialize("json", AppUser)
        app_user = serialized_app_user .objects.filter(pk=self.user.id).first()
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

        
        if app_user:
            data["user"] = app_user
        else:
            data["user"] = None

        if api_settings.UPDATE_LAST_LOGIN:
            update_last_login(None, self.user)

        return data


token_view.py

from rest_framework_simplejwt.views import TokenViewBase
from app.api.serializers import TokenSerializer


class TokenView(TokenViewBase):
    serializer_class = TokenSerializer

此代码引起此错误:'modelbase'对象是不可能的

导致此错误的行,

serialized_app_user = serializers.serialize("json", AppUser)

但我添加了,因为没有以下错误发生:object object object类型Appuser不是JSON序列化

I am trying to create a custom token to send the user object alongside the access and refresh.

Note: if there is another way to do it please tell me about it. Starting the token code from scratch is an option.

token_serializer.py

from rest_framework_simplejwt.serializers import (
    TokenObtainSerializer,
    RefreshToken,
    api_settings,
    update_last_login,
)
from django.core import serializers
from app.models.user import AppUser


class TokenSerializer(TokenObtainSerializer):
    @classmethod
    def get_token(cls, user):
        return RefreshToken.for_user(user)

    def validate(self, attrs):
        data = super().validate(attrs)

        refresh = self.get_token(self.user)

        data["refresh"] = str(refresh)
        data["access"] = str(refresh.access_token)

        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        serialized_app_user = serializers.serialize("json", AppUser)
        app_user = serialized_app_user .objects.filter(pk=self.user.id).first()
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

        
        if app_user:
            data["user"] = app_user
        else:
            data["user"] = None

        if api_settings.UPDATE_LAST_LOGIN:
            update_last_login(None, self.user)

        return data

token_view.py

from rest_framework_simplejwt.views import TokenViewBase
from app.api.serializers import TokenSerializer


class TokenView(TokenViewBase):
    serializer_class = TokenSerializer

This code led to this error: 'ModelBase' object is not iterable

The line which causes this error is

serialized_app_user = serializers.serialize("json", AppUser)

But I added it because without it the following error happens: Object of type AppUser is not JSON serializable

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

意中人 2025-02-19 08:50:57

如果您确实需要令牌中的用户信息获得端点,则需要序列化appuser对象:

...
from rest_framework import serializers
from app.models.user import AppUser


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = AppUser
        fields = '__all__'  # or any specific fields


class TokenSerializer(TokenObtainSerializer):
    def validate(self, attrs):
        ...
        app_user = serialized_app_user .objects.filter(pk=self.user.id).first()
        if app_user:
            data["user"] = UserSerializer(app_user).data
        else:
            data["user"] = None

If you really need the user information in token obtain endpoint, then you will need to serialize the AppUser object:

...
from rest_framework import serializers
from app.models.user import AppUser


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = AppUser
        fields = '__all__'  # or any specific fields


class TokenSerializer(TokenObtainSerializer):
    def validate(self, attrs):
        ...
        app_user = serialized_app_user .objects.filter(pk=self.user.id).first()
        if app_user:
            data["user"] = UserSerializer(app_user).data
        else:
            data["user"] = None
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文