Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django+;反应rest身份验证_Django_Reactjs_Django Rest Framework_Web Development Server_Django Rest Auth - Fatal编程技术网

Django+;反应rest身份验证

Django+;反应rest身份验证,django,reactjs,django-rest-framework,web-development-server,django-rest-auth,Django,Reactjs,Django Rest Framework,Web Development Server,Django Rest Auth,我正在使用rest身份验证模块在我的web应用程序上启用用户身份验证。虽然我在获取用户的详细信息时遇到了一些困难。Django rest框架在我发布用户名和密码时返回一个密钥,这就足够登录了,我还想获取其他详细信息,如user.is_staff、user.username和user.email 我尝试使用令牌序列化程序,但我不确定是否正确 ** settings.py ** REST_AUTH_SERIALIZERS = { 'TOKEN_SERIALIZER': '## How t

我正在使用rest身份验证模块在我的web应用程序上启用用户身份验证。虽然我在获取用户的详细信息时遇到了一些困难。Django rest框架在我发布用户名和密码时返回一个密钥,这就足够登录了,我还想获取其他详细信息,如user.is_staff、user.username和user.email

我尝试使用令牌序列化程序,但我不确定是否正确

** 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')
请告知丢失的是哪一件,或者是否有任何一件不正确。另外,请帮我找出######之间的部分


谢谢大家!

我认为您做得不错,在自定义
令牌序列化程序中,您需要以某种方式获取用户。如果我查看
LoginView
的代码,我发现您可以在序列化程序中使用
上下文中的
请求
对象,因此您的
令牌序列化程序应该如下所示:

# 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',
}


编辑: 这可能会中断register视图,因为如果查看第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
然后使用此视图在URL中注册

# urls.py
from views import CustomRegisterView


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

您是否将其与JWT一起使用?参考doc的这一部分,我不确定这意味着什么,但我正在使用restauth模块创建一个令牌。登录的URL是rest-auth/login/同样,注册的URL是rest-auth/signup/@SadanA。我已经找了很久了,谢谢。但是你的答案缺少一点,你需要添加一个上下文。我是这样做的:serializer\u context={'request':request,}return UserSerializer(request.user,context=serializer\u context)。这对于登录非常有效,但是我如何才能使其用于注册新用户?我的意思是,目前它抛出了一个错误,因为没有属性user yes。关于上下文的第一个问题取决于
UserSerializer
中是否需要请求对象。关于注册新用户的第二个问题,这也是可能的,但您可能必须覆盖
RegisterView
@InigoMontoya的
get\u response\u data
方法。我更新了我的答案以反映您问题的解决方案,这可能会对您有所帮助。谢谢@Sadan。我试过你的建议,但遇到了问题。你可以在这里检查,我创建了一个单独的问题,以便将其标记为已解决,因为我不是这个问题的作者