欢迎访问宙启技术站
智能推送

DjangoRESTFramework实现用户注册和登录

发布时间:2023-12-28 21:44:09

Django REST Framework (DRF)是一个基于Django的强大框架,可用于构建Web API。它提供了许多功能,包括身份验证、序列化、视图、路由等,可以帮助我们更轻松地构建用户注册和登录功能。

首先,我们需要安装Django和DRF。你可以使用以下命令来安装它们:

pip install django
pip install djangorestframework

接下来,我们需要创建一个Django项目和一个应用程序。使用以下命令创建Django项目:

django-admin startproject myproject

然后,使用以下命令创建一个名为"users"的应用程序:

cd myproject
python manage.py startapp users

现在,我们可以开始编写代码了。首先,我们需要在"users"应用中创建一个模型来表示用户。在"users/models.py"文件中添加以下代码:

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin

class CustomUserManager(BaseUserManager):
    def create_user(self, email, username, password=None):
        if not email:
            raise ValueError('The Email must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, username=username)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, username, password):
        user = self.create_user(email, username, password)
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user

class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    username = models.CharField(max_length=150, unique=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    objects = CustomUserManager()

    def __str__(self):
        return self.email

这个模型扩展了Django内置的AbstractBaseUser和PermissionsMixin类。我们还创建了一个CustomUserManager类来为我们的模型提供自定义的用户管理。其中,create_user()方法用于创建普通用户,create_superuser()方法用于创建超级用户。

接下来,我们需要对应用程序设置进行一些更改。打开"myproject/settings.py"文件,并添加以下代码:

INSTALLED_APPS = [
    ...
    'rest_framework',
    'users',
]

这将启用DRF和我们的"users"应用程序。

然后,我们需要为该应用程序创建序列化器。在"users/serializers.py"文件中添加以下代码:

from rest_framework import serializers
from .models import CustomUser

class CustomUserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True)

    class Meta:
        model = CustomUser
        fields = ['id', 'email', 'username', 'password']

    def create(self, validated_data):
        user = CustomUser.objects.create_user(
            email=validated_data['email'],
            username=validated_data['username'],
            password=validated_data['password']
        )
        return user

这个序列化器将模型字段映射为JSON字段,并为密码字段设置了write_only=True,以确保密码不会被显示在响应中。

接下来,我们需要为应用程序创建视图。在"users/views.py"文件中添加以下代码:

from rest_framework import generics
from .models import CustomUser
from .serializers import CustomUserSerializer

class UserCreateView(generics.CreateAPIView):
    queryset = CustomUser.objects.all()
    serializer_class = CustomUserSerializer

这个视图类继承自generics.CreateAPIView类,该类提供了一个方便的视图,用于处理创建新用户的POST请求。

现在,我们需要设置路由。在"myproject/urls.py"文件中添加以下代码:

from django.urls import path
from users.views import UserCreateView

urlpatterns = [
    ...
    path('api/register/', UserCreateView.as_view(), name='register'),
]

这将为我们的应用程序添加一个名为"register"的路径。

最后,我们需要运行Django开发服务器。使用以下命令启动服务器:

python manage.py runserver

现在,我们就可以使用API进行用户注册了。打开Postman或类似的工具,向以下URL发送POST请求:http://localhost:8000/api/register/,并传递以下数据作为请求体(使用JSON格式):

{
    "email": "test@gmail.com",
    "username": "testuser",
    "password": "testpassword"
}

如果一切正常,你将收到一个201 Created的响应,同时用户也将被创建。

现在,我们可以继续实现用户登录功能。为此,我们需要编写另一个视图类和一个序列化器。在"users/views.py"文件中添加以下代码:

from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.authtoken.models import Token
from rest_framework.response import Response


class UserLoginView(ObtainAuthToken):
    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data, context={'request': request})
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token, created = Token.objects.get_or_create(user=user)
        return Response({'token': token.key})

这个视图类继承自DRF的ObtainAuthToken类,并重写了post()方法来返回一个包含Token的响应。

然后,在"users/serializers.py"文件中添加以下代码:

from django.contrib.auth import authenticate
from rest_framework import serializers

class UserLoginSerializer(serializers.Serializer):
    email = serializers.EmailField(required=True)
    password = serializers.CharField(style={'input_type': 'password'}, trim_whitespace=False)

    def validate(self, attrs):
        email = attrs.get('email')
        password = attrs.get('password')

        if email and password:
            user = authenticate(request=self.context.get('request'), email=email, password=password)
            if not user:
                msg = 'Unable to log in with provided credentials.'
                raise serializers.ValidationError(msg, code='authorization')
        else:
            msg = 'Must include "email" and "password".'
            raise serializers.ValidationError(msg, code='authorization')

        attrs['user'] = user
        return attrs

这个序列化器验证用户提供的电子邮件和密码,并使用authenticate()方法验证它们是否有效。

接下来,我们需要设置新的URL路由,以便能够访问此视图。在"myproject/urls.py"文件中添加以下代码:

from django.urls import path
from users.views import UserCreateView, UserLoginView

urlpatterns = [
    ...
    path('api/register/', UserCreateView.as_view(), name='register'),
    path('api/login/', UserLoginView.as_view(), name='login'),
]

现在,我们可以使用API进行用户登录。使用以下URL发送POST请求:http://localhost:8000/api/login/,并传递以下数据作为请求体(使用JSON格式):

{
    "email": "test@gmail.com",
    "password": "testpassword"
}

如果提供的凭据有效,你将收到一个包含Token的响应。

这样,我们就实现了使用Django REST Framework进行用户注册和登录功能。你可以根据需要进一步扩展该功能,例如添加电子邮件确认、密码重置等等。希望这个例子对你有所帮助!