Как задать возвращение имени с токеном для Django API
Есть simpleJWT и Django RESTFRAMEWORK. Мне нужно вместе с токеном вернуть name или email, но что-то не пойму как это сделать.
serializers.py
from rest_framework import serializers
User = get_user_model()
class UserCreateSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True, required=True, style={
"input_type": "password"})
password2 = serializers.CharField(
style={"input_type": "password"}, write_only=True, label="Confirm password")
class Meta:
model = User
fields = [
"username",
"email",
"password",
"password2",
]
extra_kwargs = {"password": {"write_only": True}}
def create(self, validated_data):
username = validated_data["username"]
email = validated_data["email"]
password = validated_data["password"]
password2 = validated_data["password2"]
if (email and User.objects.filter(email=email).exclude(username=username).exists()):
raise serializers.ValidationError(
{"email": " Email should be unquil."})
if password != password2:
raise serializers.ValidationError(
{"password": "The two passwords differ."})
user = User(username=username, email=email)
user.set_password(password)
user.save()
return user
views.py
from rest_framework import permissions
from rest_framework import response, decorators, permissions, status
from rest_framework_simplejwt.tokens import RefreshToken
from .serializers import UserCreateSerializer
User = get_user_model()
@decorators.api_view(["POST"])
@decorators.permission_classes([permissions.AllowAny])
def registration(request):
user_data = request.user
serializer = UserCreateSerializer(data=request.data)
if not serializer.is_valid():
return response.Response(serializer.errors, status.HTTP_400_BAD_REQUEST)
user = serializer.save()
refresh = RefreshToken.for_user(user)
res = {
"refresh": str(refresh),
"access": str(refresh.access_token),
"user": str(user),
}
return response.Response(res, status.HTTP_201_CREATED)
Ответы (1 шт):
Автор решения: 5c0rp
→ Ссылка
Благо есть документация. Но тем не менее повторюсь:
- Нужно добавить
rest_framework_simplejwt.authentication.JWTAuthenticationв настройкиREST_FRAMEWORK, а именно вDEFAULT_AUTHENTICATION_CLASSES. - Для аутентификации достаточно указать в
urlpatternsследующий путь -path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair')(путь может быть иapi/login, тут как вам удобно).
Если же вам нужно как то дополнить данные отдаваемые в TokenObtainPairView вы можете написать свою view унаследованную от TokenObtainPairView.
Как пример:
from rest_framework_simplejwt.views import TokenObtainPairView
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
def validate(self, attrs):
data = super().validate(attrs)
data['email'] = self.user.email
return data
class CustomTokenObtainPairView(TokenObtainPairView):
serializer_class = CustomTokenObtainPairSerializer
urlpatterns = [
path('api/token/', CustomTokenObtainPairView.as_view(), name='token_obtain_pair')
]