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

下面是详细的攻略。

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模板之模板过滤器与自定义模板过滤器示例

    Python Django模板之模板过滤器与自定义模板过滤器示例 什么是模板过滤器? 模板过滤器是Django模板语言中的一种特殊的模板标签,用于对模板变量进行处理和转换。使用模板过滤器可以在模板渲染时对变量进行格式化、编码、截断等操作,从而更好的展示页面内容。 模板过滤器通常在模板变量后使用,使用竖线“|”隔开,例如:{{variable|filter}}…

    人工智能概览 2023年5月25日
    00
  • 使用PM2+nginx部署python项目的方法示例

    我将为您提供一份“使用PM2+nginx部署python项目的方法示例”的完整攻略,其中包含了详细的步骤说明和两个示例。 前置条件 在开始前,请确保您的环境已经安装好了以下软件: Node.js PM2 Nginx 同时,您也需要一份 Python 项目代码。 步骤一:安装配置PM2 在命令行中执行以下命令安装 PM2: npm install pm2 -g…

    人工智能概览 2023年5月25日
    00
  • Django 开发调试工具 Django-debug-toolbar使用详解

    Django 开发调试工具 Django-debug-toolbar使用详解 在Django开发过程中,我们可能需要使用一些开发调试工具,这些工具可以帮助我们更好的调试和优化我们的应用。现在我们要详细讲解一个非常实用的调试工具,那就是Django-debug-toolbar。 什么是 Django-debug-toolbar? Django-debug-to…

    人工智能概论 2023年5月25日
    00
  • C++ OpenCV学习之图像金字塔与图像融合详解

    C++ OpenCV学习之图像金字塔与图像融合详解 前言 图像金字塔和图像融合在计算机视觉中有广泛的应用。本篇文章将详细讲解如何使用C++ OpenCV实现图像金字塔和图像融合,包括基本的概念和原理以及示例代码。 图像金字塔 什么是图像金字塔? 图像金字塔是一种处理图像的技术,通常用于图像缩放或增强。它通过将原始图像逐步降采样来生成一系列图像,每个图像比前一…

    人工智能概览 2023年5月25日
    00
  • 微信小程序 本地数据存储实例详解

    针对“微信小程序 本地数据存储实例详解”的完整攻略,我将从以下几个方面来进行讲解: 什么是微信小程序本地数据存储? 如何使用微信小程序本地数据存储? 微信小程序本地数据存储的实例示例说明。 1. 什么是微信小程序本地数据存储? 微信小程序本地数据存储是指将小程序中的数据保存在客户端本地,以方便下一次使用。它不仅可以减少小程序每次访问服务器的网络请求时间,还能…

    人工智能概论 2023年5月25日
    00
  • 关于Django使用 django-celery-beat动态添加定时任务的方法

    关于Django使用django-celery-beat动态添加定时任务的方法 Django是一个开放源代码的高层次Python Web框架。开发人员可以利用Django的许多条款和模块来开发完整的Web应用程序。而celery是Python语言使用的一个异步任务队列,它轻量级、高效,可靠,非常适用于处理高并发的异步任务。而django-celery-bea…

    人工智能概览 2023年5月25日
    00
  • kubernetes集群搭建Zabbix监控平台的详细过程

    Kubernetes集群搭建Zabbix监控平台 1. 安装Zabbix Server 在Kubernetes集群中安装Zabbix Server,可以用以下步骤实现: 1.1 创建Zabbix Server的PVC(PersistentVolumeClaim) 在Kubernetes集群中创建PVC,用于存储Zabbix Server的数据。在命令行界面中…

    人工智能概览 2023年5月25日
    00
  • django富文本编辑器的实现示例

    下面详细讲解一下”Django富文本编辑器的实现示例”的完整攻略。 1. 富文本编辑器简介 富文本编辑器的作用是在 Web 应用程序中提供了一个用户友好的界面,使用户可以在 Web 应用程序中撰写和编辑富文本格式的内容。它们通常包括样式和格式设置工具,如下划线、加粗、斜体、字体、字号和颜色选择器。 2. Django的富文本编辑器安装 Django的富文本编…

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