django项目中使用手机号登录的实例代码

yizhihongxing

下面是详细的攻略。

1. 安装依赖库

首先需要安装 djangodjango-rest-frameworkdjango-rest-framework-simplejwt 这三个库。可以通过以下命令进行安装:

pip install django django-rest-framework django-rest-framework-simplejwt

2. 创建用户模型

models.py 文件中创建用户模型,模型中包含手机号和密码两个字段。可以使用 AbstractBaseUserBaseUserManager 实现自定义用户模型,代码如下:

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

class CustomUserManager(BaseUserManager):
    def create_user(self, phone_number, password=None, **extra_fields):
        if not phone_number:
            raise ValueError('Phone number must be set')
        user = self.model(phone_number=phone_number, **extra_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, phone_number, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self.create_user(phone_number, password, **extra_fields)

class CustomUser(AbstractBaseUser):
    phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.")
    phone_number = models.CharField(validators=[phone_regex], max_length=17, unique=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    objects = CustomUserManager()

    USERNAME_FIELD = 'phone_number'
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.phone_number

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

其中,CustomUserManager 继承 BaseUserManagercreate_user 方法用于创建普通用户,create_superuser 方法用于创建管理员用户。在 CustomUser 中定义手机号(phone_regex)和密码(password)两个字段并赋予不同的权限。

3. 创建登录视图

views.py 文件中创建登录视图。我们可以使用 APIView 作为基类,通过 serializerjwt 库实现登录功能。代码如下:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework_simplejwt.tokens import RefreshToken
from .serializers import AuthTokenSerializer

class LoginAPIView(APIView):
    serializer_class = AuthTokenSerializer

    def post(self, request):
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        refresh = RefreshToken.for_user(user)
        return Response({
            'refresh': str(refresh),
            'access': str(refresh.access_token),
        })

其中,AuthTokenSerializer 是我们自定义的登录序列化器,用于验证用户。调用 RefreshToken.for_user(user) 生成 JWT 的 token,并将其作为 JSON 格式返回。此处我们只返回了 access_token 和 refresh_token,没有返回 user 信息。

4. 创建登录序列化器

serializers.py 文件中创建登录序列化器,用于验证用户输入的手机号和密码,并返回对应的用户信息。代码如下:

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

class AuthTokenSerializer(serializers.Serializer):
    phone_number = serializers.CharField(max_length=500)
    password = serializers.CharField(
        style={'input_type': 'password'},
        trim_whitespace=False
    )

    def validate(self, attrs):
        phone_number = attrs.get('phone_number')
        password = attrs.get('password')
        user = authenticate(
            request=self.context.get('request'),
            username=phone_number,
            password=password
        )
        if not user:
            raise serializers.ValidationError(
                'Invalid phone number or password'
            )
        attrs['user'] = user
        return attrs

其中,CustomUser 是我们自定义的用户模型,authenticate 函数用于验证用户名和密码是否匹配。

5. 添加路由

urls.py 文件中添加路由,用于访问登录视图。代码如下:

from django.urls import path
from .views import LoginAPIView

urlpatterns = [
    path('login/', LoginAPIView.as_view(), name='login'),
    # ... 其他路由
]

示例说明

以下是两条使用手机号登录的实例代码。

示例 1:使用 Postman 发送 POST 请求登录

打开 Postman,选择 POST 请求,将 url 设置为 http://localhost:8000/login/,在 Body 中传递 JSON 格式的手机号和密码参数:

{
    "phone_number": "+1234567890",
    "password": "password123"
}

点击 Send,我们会得到如下的返回结果:

{
    "refresh": "<token>",
    "access": "<token>"
}

其中的 <token> 就是生成的 JWT 的 token。

示例 2:使用 Django Rest Framework 的 API 调用登录

使用 Django Rest Framework 的 API 调用登录,可以通过在 views.py 中创建 TokenObtainPairView 视图来实现,代码如下:

from rest_framework_simplejwt.views import TokenObtainPairView

class CustomTokenObtainPairView(TokenObtainPairView):
    serializer_class = CustomTokenObtainPairSerializer

其中,CustomTokenObtainPairSerializer 是自定义的序列化器,用于验证用户输入的手机号和密码。在 urls.py 中添加该视图的路由:

from .views import CustomTokenObtainPairView

urlpatterns = [
    # ...
    path('api/token/', CustomTokenObtainPairView.as_view(), name='token_obtain_pair'),
]

使用 API 调用登录的请求示例:

{
    "phone_number": "+1234567890",
    "password": "password123"
}

返回结果与示例 1 相同。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django项目中使用手机号登录的实例代码 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • Python Django使用forms来实现评论功能

    下面是Python Django使用forms来实现评论功能的完整攻略。 1. 安装Django 在开始实现评论功能之前,我们需要先安装Django。可以通过以下命令使用pip安装最新版本的Django: pip install Django 如果需要安装特定版本的Django,请将命令中的“Django”替换为相应的版本号。 2. 创建Django项目和应…

    人工智能概论 2023年5月25日
    00
  • 关于Linux搭建RabbitMQ集群环境图文详解

    关于Linux搭建RabbitMQ集群环境图文详解 引言 RabbitMQ 是一个开源的消息中间件,广泛应用于分布式系统中。在实际应用场景中,我们往往需要通过搭建 RabbitMQ 集群来提高可用性和性能。本文将详细介绍如何在 Linux 系统上搭建 RabbitMQ 集群环境。 准备工作 在开始搭建 RabbitMQ 集群之前,需要做好以下准备工作: 安装…

    人工智能概览 2023年5月25日
    00
  • 详解Django自定义图片和文件上传路径(upload_to)的2种方式

    Sure!下面是“详解Django自定义图片和文件上传路径(upload_to)的2种方式”的完整攻略。 方式1:在models.py中定义upload_to参数 在Django中,通常使用FileField或者ImageField来上传文件或者图片。这类字段包含一个upload_to参数,你可以指定这个参数来上传到自定义的路径。下面是示例代码: from …

    人工智能概览 2023年5月25日
    00
  • Android音视频之视频采集(系统API预览)

    来分享一下 Android 音视频之视频采集(系统 API 预览)的完整攻略。 一、什么是视频采集? 视频采集是将外部环境中的视频信号转换成数字信号的过程,是实现视频录制、视频直播等功能必备的第一步。 二、Android 系统 API 预览实现视频采集 1. 相机设备 Android 的视频采集可通过相机设备实现。要获取相机设备,需要使用 Camera AP…

    人工智能概览 2023年5月25日
    00
  • Django自定义User模型、认证、权限控制的操作

    下面是Django自定义User模型、认证、权限控制的完整攻略,主要包括以下几个步骤: 创建自定义User模型 Django提供了一个内置的User模型,但是如果我们需要添加自定义的字段或属性,就需要创建自定义的User模型。具体操作步骤: 在models.py中定义自定义的User模型,在其中继承AbstractBaseUser类: “`python f…

    人工智能概览 2023年5月25日
    00
  • 从汇编看c++中引用与指针的使用分析

    从汇编看c++中引用与指针的使用分析 引用与指针的定义与使用方法 在 C++ 中,引用和指针都是用来间接访问变量的。它们之间的主要区别在于,引用是一个别名,指针是一个变量。换句话说,引用是变量的另一个名字,而指针是一个变量,它存储了一个变量的地址。 引用的定义和使用方法 引用要使用 & 符号来声明并初始化。例如:int &a = b;其中 b…

    人工智能概览 2023年5月25日
    00
  • nginx负载功能+nfs服务器功能解析

    nginx负载功能+nfs服务器功能解析 本文将为读者介绍如何使用nginx的负载功能搭建NFS服务器,并提供两条使用示例说明。 什么是nginx负载功能? nginx是一款高性能的Web服务器和反向代理服务器,它的负载均衡功能可以使多个服务器共同处理客户端请求并实现横向扩展,以提高服务器处理能力和可用性。 搭建NFS服务器 NFS(Network File…

    人工智能概览 2023年5月25日
    00
  • 详解Python的爬虫框架 Scrapy

    详解Python的爬虫框架 Scrapy 什么是Scrapy Scrapy是一个用于爬取Web站点并提取结构化数据的应用程序框架。它基于Twisted框架构建,并提供了数据结构和XML(and JSON,CSV等数据格式)导入/导出的支持。 使用Scrapy,可以轻松地创建爬取任务,然后分析和保存数据以在后续分析中使用。 Scrapy的组成部分 Spider…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部