DjangoRESTFramework实现用户注册和登录
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进行用户注册和登录功能。你可以根据需要进一步扩展该功能,例如添加电子邮件确认、密码重置等等。希望这个例子对你有所帮助!
