搜索
首页后端开发Python教程Django 帐户管理应用程序(忘记密码和帐户详细信息

从这篇文章中可以期待什么?

我们在之前的文章中开始开发帐户应用程序,本文将以此为基础。它将涵盖

  • 用于忘记密码、重新发送代码和帐户详细信息的序列化程序。
  • 相同 API 的视图。
  • 当然还有网址。

我会尽力介绍尽可能多的细节,以免让您感到无聊,但我仍然希望您熟悉 Python 和 Django 的某些方面。

最终版本的源代码可以在https://github.com/saad4software/alive-diary-backend

系列订购

感兴趣的话可以查看之前的文章!

  1. 从头开始的人工智能项目、创意、Alive 日记
  2. 用 Google AI Studio 证明它是可行的
  3. Django API 项目设置
  4. Django账户管理(一)、注册与激活
  5. Django账户管理(二)、登录及修改密码
  6. 带有 Swagger 的 Django Rest 框架
  7. Django 帐户管理 (3) 忘记密码和帐户详细信息(您在这里?)

它是如何运作的?

忘记密码请求如何运作?流程应遵循以下步骤

  • 用户显然忘记了他的密码?我真傻。
  • 用户输入他/她的电子邮件地址。
  • 一封带有验证码的邮件发送至邮箱。
  • 用户可以使用电子邮件和激活码来设置新密码。

因此,我们需要一个 API 来获取电子邮件地址、创建激活码并将其发送给用户,与重新发送代码 API 相同。
我们还需要另一个 API 来获取电子邮件、激活码和新密码来重置密码。
从重新发送代码 API 开始现在听起来是个好主意。

重新发送代码 API

一如既往,让我们从序列化器开始

class SendCodeSerializer(serializers.Serializer):
    username = serializers.CharField(required=True)

    def validate_username(self, value):
        if not is_valid_email(value):
            raise serializers.ValidationError("invalid_email")

        verification_query = get_user_model().objects.filter(username=value).exists()
        if not verification_query:
            raise serializers.ValidationError("invalid_username")

        return value

app_account/serializers.py

这是一个通用序列化程序,只有一个字段,即用户名,我们正在检查以确保它是有效的电子邮件地址,并且用户已在系统中注册。

现在来看看

class AccountSendCodeView(APIView):
    permission_classes = ()
    renderer_classes = [CustomRenderer, BrowsableAPIRenderer]


    @swagger_auto_schema(request_body=SendCodeSerializer)
    def post(self, request, *args, **kwargs):
        serializer = SendCodeSerializer(data=request.data)

        if not serializer.is_valid():
            raise APIException(serializer.errors)

        user = get_user_model().objects.filter(username=serializer.validated_data.get("username")).first()
        code = VerificationCode(user=user, email=user.username)
        code.save()

        send_mail(
            'Password Reset Code',
            'Your password reset code is ' + str(code.code),
            f'AliveDiary',
            [user.username],
            fail_silently=False,
        )

        return Response("success")

app_account/views.py

视图首先验证请求,然后获取用户并为其创建代码实例。最后通过电子邮件将代码发送给用户。
最后是网址

urlpatterns = [
    path('register/', AccountRegisterView.as_view()),
    path('activate/', AccountActivateView.as_view()),

    path('login/', AccountLoginView.as_view()),
    path('refresh/', AccountRefreshTokenView.as_view()),

    path('code/', AccountSendCodeView.as_view()), #new

    path('password/', AccountChangePasswordView.as_view()),
]

app_account/urls.py

我们现在可以在 swagger 上测试它

Django accounts management app ( forgot password and account details

重置密码API

序列化器应包含用户名、发送的代码和新密码;它应该检查以确保它是有效的用户名和代码,有点像

class ForgotPasswordSerializer(serializers.Serializer):
    username = serializers.CharField(required=True)
    code = serializers.CharField(required=True)
    new_password = serializers.CharField(required=True)

    def validate(self, data):
        verification_query = VerificationCode.objects.filter(
            user__username=data['username'],
        ).order_by('-id')

        if not verification_query.exists():
            raise serializers.ValidationError("no_code")

        code = verification_query[0]
        if str(code.code) != str(data['code']):
            raise serializers.ValidationError("invalid_code")

        return data

app_account/serializers.py

所有字段都是必需的,我们使用验证函数来同时验证用户名和代码。如果该用户没有即时代码,我们会引发验证错误,如果发送的代码与即时代码值不匹配,我们会通过引发“invalid_code”验证错误来通知用户。

对于视图,我们需要首先验证序列化器

class SendCodeSerializer(serializers.Serializer):
    username = serializers.CharField(required=True)

    def validate_username(self, value):
        if not is_valid_email(value):
            raise serializers.ValidationError("invalid_email")

        verification_query = get_user_model().objects.filter(username=value).exists()
        if not verification_query:
            raise serializers.ValidationError("invalid_username")

        return value

app_account/views.py

如果序列化器无效,我们会引发一个带有序列化器错误的 API 异常,如果有效,我们将使用序列化器数据查询验证瞬间。请注意,此查询始终存在,并且发送的代码与验证即时代码值相同,因为此查询已经通过了序列化器检查。
然后我们从数据库中删除验证实例,并使用序列化器中的“new_password”值更新用户密码

最后,让我们更新 URL 文件

class AccountSendCodeView(APIView):
    permission_classes = ()
    renderer_classes = [CustomRenderer, BrowsableAPIRenderer]


    @swagger_auto_schema(request_body=SendCodeSerializer)
    def post(self, request, *args, **kwargs):
        serializer = SendCodeSerializer(data=request.data)

        if not serializer.is_valid():
            raise APIException(serializer.errors)

        user = get_user_model().objects.filter(username=serializer.validated_data.get("username")).first()
        code = VerificationCode(user=user, email=user.username)
        code.save()

        send_mail(
            'Password Reset Code',
            'Your password reset code is ' + str(code.code),
            f'AliveDiary',
            [user.username],
            fail_silently=False,
        )

        return Response("success")

app_account/urls.py

账户详情API

让我们首先为用户模型创建一个序列化器,它看起来像这样

urlpatterns = [
    path('register/', AccountRegisterView.as_view()),
    path('activate/', AccountActivateView.as_view()),

    path('login/', AccountLoginView.as_view()),
    path('refresh/', AccountRefreshTokenView.as_view()),

    path('code/', AccountSendCodeView.as_view()), #new

    path('password/', AccountChangePasswordView.as_view()),
]

app_account/serializers.py

它是一个模型序列化器,我们选择了用户模型并列出了要序列化的字段。

转向视图,我们需要一个允许用户通过 GET 请求获取用户详细信息并通过 POST 请求更新用户详细信息的视图,它看起来有点像

class ForgotPasswordSerializer(serializers.Serializer):
    username = serializers.CharField(required=True)
    code = serializers.CharField(required=True)
    new_password = serializers.CharField(required=True)

    def validate(self, data):
        verification_query = VerificationCode.objects.filter(
            user__username=data['username'],
        ).order_by('-id')

        if not verification_query.exists():
            raise serializers.ValidationError("no_code")

        code = verification_query[0]
        if str(code.code) != str(data['code']):
            raise serializers.ValidationError("invalid_code")

        return data

app_account/views.py

和网址

class AccountForgotPasswordView(APIView):
    permission_classes = ()
    renderer_classes = [CustomRenderer, BrowsableAPIRenderer]

    @swagger_auto_schema(request_body=ForgotPasswordSerializer)
    def post(self, request, *args, **kwargs):
        serializer = ForgotPasswordSerializer(data=request.data)
        if not serializer.is_valid():
            raise APIException(serializer.errors)

        verification_query = VerificationCode.objects.filter(
            user__username=serializer.validated_data.get('username'),
            code=serializer.validated_data.get('code')
        ).order_by('-id')

        verification_query.delete()

        user = get_user_model().objects.filter(
            username=serializer.validated_data.get('username'),
        ).first()
        user.set_password(serializer.validated_data.get('new_password'))
        user.save()
        return Response("success")

app_account/urls.py

就是这样!让我们用 Swagger 来测试一下,打开 http://localhost:8555/swagger/ 并使用登录名来获取有效的令牌。为了测试任何授权请求,我们必须单击锁定 ?图标,任何 swagger 中的锁图标,并为令牌提供“Bearer”前缀,有点像“Bearer eyJhbGc...”

Django accounts management app ( forgot password and account details

现在测试详细信息 API 应返回如图所示的帐户详细信息

Django accounts management app ( forgot password and account details

就是这样!恭喜,您拥有一个功能齐全的帐户管理应用程序,只需进行最少的修改即可在任何 Django 应用程序中使用

您认为它还需要其他功能吗?请提出建议!

我们将在下一篇文章中回到主应用程序,所以

敬请期待?

以上是Django 帐户管理应用程序(忘记密码和帐户详细信息的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Python vs. C:了解关键差异Python vs. C:了解关键差异Apr 21, 2025 am 12:18 AM

Python和C 各有优势,选择应基于项目需求。1)Python适合快速开发和数据处理,因其简洁语法和动态类型。2)C 适用于高性能和系统编程,因其静态类型和手动内存管理。

Python vs.C:您的项目选择哪种语言?Python vs.C:您的项目选择哪种语言?Apr 21, 2025 am 12:17 AM

选择Python还是C 取决于项目需求:1)如果需要快速开发、数据处理和原型设计,选择Python;2)如果需要高性能、低延迟和接近硬件的控制,选择C 。

达到python目标:每天2小时的力量达到python目标:每天2小时的力量Apr 20, 2025 am 12:21 AM

通过每天投入2小时的Python学习,可以有效提升编程技能。1.学习新知识:阅读文档或观看教程。2.实践:编写代码和完成练习。3.复习:巩固所学内容。4.项目实践:应用所学于实际项目中。这样的结构化学习计划能帮助你系统掌握Python并实现职业目标。

最大化2小时:有效的Python学习策略最大化2小时:有效的Python学习策略Apr 20, 2025 am 12:20 AM

在两小时内高效学习Python的方法包括:1.回顾基础知识,确保熟悉Python的安装和基本语法;2.理解Python的核心概念,如变量、列表、函数等;3.通过使用示例掌握基本和高级用法;4.学习常见错误与调试技巧;5.应用性能优化与最佳实践,如使用列表推导式和遵循PEP8风格指南。

在Python和C之间进行选择:适合您的语言在Python和C之间进行选择:适合您的语言Apr 20, 2025 am 12:20 AM

Python适合初学者和数据科学,C 适用于系统编程和游戏开发。1.Python简洁易用,适用于数据科学和Web开发。2.C 提供高性能和控制力,适用于游戏开发和系统编程。选择应基于项目需求和个人兴趣。

Python与C:编程语言的比较分析Python与C:编程语言的比较分析Apr 20, 2025 am 12:14 AM

Python更适合数据科学和快速开发,C 更适合高性能和系统编程。1.Python语法简洁,易于学习,适用于数据处理和科学计算。2.C 语法复杂,但性能优越,常用于游戏开发和系统编程。

每天2小时:Python学习的潜力每天2小时:Python学习的潜力Apr 20, 2025 am 12:14 AM

每天投入两小时学习Python是可行的。1.学习新知识:用一小时学习新概念,如列表和字典。2.实践和练习:用一小时进行编程练习,如编写小程序。通过合理规划和坚持不懈,你可以在短时间内掌握Python的核心概念。

Python与C:学习曲线和易用性Python与C:学习曲线和易用性Apr 19, 2025 am 12:20 AM

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),