【问题标题】:Django+React rest-authDjango+React 休息认证
【发布时间】:2020-04-28 11:03:29
【问题描述】:

我正在使用 rest-auth 模块在我的网络应用程序上启用用户身份验证。尽管我在获取有关用户的详细信息时遇到了一些困难。当我发布我的用户名和密码时,Django-rest-framework 会返回一个密钥,而这足以登录我还想获取其他详细信息,例如 user.is_staff、user.username 和 user.email。

我尝试使用 Token 序列化程序,但我不确定我是否做得对。

** settings.py ** 

REST_AUTH_SERIALIZERS = {
    'TOKEN_SERIALIZER': '## How to define the path to my serializer ##',
}

** serializers.py **

from rest_framework import serializers
from lms.models.post_models import Post
from django.contrib.auth.models import User
from rest_auth.models import TokenModel    

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username', 'email')

class TokenSerializer(serializers.ModelSerializer):
    user = UserSerializer()
    class Meta:
        model = TokenModel
        fields = ('key', 'user')

请说出缺少的部分或是否有任何部分不正确。另外,请帮我弄清楚## ##之间的部分。

谢谢!

【问题讨论】:

  • 你是和 JWT 一起使用的吗?参考这部分文档django-rest-auth.readthedocs.io/en/latest/…
  • 我不确定这意味着什么,但我正在使用 rest-auth 模块创建一个令牌。所以登录的 URL 是 rest-auth/login/ 类似地,注册它是 rest-auth/signup/ @SadanA。

标签: django reactjs django-rest-framework web-development-server django-rest-auth


【解决方案1】:

我认为您做得对,在您的自定义 TokenSerializer 中,您需要以某种方式获取用户。如果我查看LoginView 的代码,我发现您可以在序列化程序中使用来自contextrequest 对象,所以您的TokenSerializer 应该是这样的:

# serializers.py

class TokenSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()

    class Meta:
        model = TokenModel
        fields = ('key', 'user')

    def get_user(self, instance):
        request = self.context.get('request')
        return UserSerializer(request.user).data

然后settings.py

REST_AUTH_SERIALIZERS = {
    'TOKEN_SERIALIZER': 'project.serializers.TokenSerializer',
}


已编辑: 这可能会破坏您的注册视图,因为如果您查看source code,在第 60 行它使用相同的序列化程序,但不会在序列化程序的上下文中传递请求对象。您可以通过覆盖此方法使其工作

# views.py

from django.conf import settings
from rest_auth.registeraion.views import RegisterView
from allauth.account import app_settings as allauth_settings
from rest_auth.app_settings import (TokenSerializer,
                                    JWTSerializer)


class CustomRegisterView(RegisterView):
    def get_response_data(self, user):
        if allauth_settings.EMAIL_VERIFICATION == \
                allauth_settings.EmailVerificationMethod.MANDATORY:
            return {"detail": _("Verification e-mail sent.")}

        if getattr(settings, 'REST_USE_JWT', False):
            data = {
                'user': user,
                'token': self.token
            }
            return JWTSerializer(data).data
        else:
            return TokenSerializer(user.auth_token, context={"request": self.request}).data

然后在您的网址中使用此视图进行注册

# urls.py
from views import CustomRegisterView


urlpatterns = [
    ...,
    url(r'^rest-auth/', include('rest_auth.urls')),
    url(r'^rest-auth/registration/', CustomRegisterView.as_view())
    ]

【讨论】:

  • 我找这个很久了,谢谢。但是您的答案中缺少一件事,您需要添加上下文。我这样做了: serializer_context = { 'request': request, } return UserSerializer(request.user, context=serializer_context).data
  • 我又收到了一个关于此的问题。这非常适合登录,但我怎样才能使它适用于注册新用户?我的意思是,目前它会引发错误,因为还没有属性用户
  • 您关于上下文的第一个问题取决于您是否需要 UserSerializer 中的请求对象。关于注册新用户的第二个问题,这也是可能的,但您可能必须覆盖 RegisterView github.com/Tivix/django-rest-auth/blob/…get_response_data 方法
  • @InigoMontoya 我更新了我的答案以反映您的问题的解决方案,可能会对您有所帮助。
  • 谢谢@Sadan。我试过你的建议,但我遇到了一个问题。你可以在这里查看stackoverflow.com/questions/61606120/…我创建了一个单独的问题,以便将其标记为已解决,因为我不是这个问题的作者
猜你喜欢
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
相关资源
最近更新 更多