django - Django+React 休息认证
问题描述
我正在使用 rest-auth 模块在我的网络应用程序上启用用户身份验证。尽管我在获取有关用户的详细信息时遇到了一些困难。当我发布我的用户名和密码时,Django-rest-framework 会返回一个密钥,而这足以登录我还想获取其他详细信息,如 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')
请说明缺少哪一块或是否有任何一块不正确。另外,请帮我弄清楚## ##之间的部分。
谢谢!
解决方案
我认为您做得对,在您的自定义中,TokenSerializer
您需要以某种方式获取用户。如果我查看 的代码LoginView
,我发现您可以在序列化程序中使用request
对象context
,所以您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',
}
已编辑: 这可能会破坏您的注册视图,因为如果您查看源代码,在第 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())
]
推荐阅读
- algorithm - 广度优先搜索时是否需要区分3个状态字段
- analytics - 衡量使用了哪些 Alexa 话语
- c# - 无法绑定到“menuList”,因为它不是“树视图”的已知属性
- python - 如何在 matplotlib 图形上循环显示颜色和线条样式?
- typescript - 在 TypeScript 中使用映射类型来限制方法类型
- regex - 如何防止附加信息被合并到这个正则表达式中?
- string - 关于 UWP 中字符串的 UDP 套接字
- spring - Spring Cloud Stream 中的事务
- php - 如何将范围/范围传递给php中的函数?
- java - 如何使用 Volley 从 Json 获取类别和子类别数据