从这篇文章中可以期待什么?
我们在之前的文章中开始开发帐户应用程序,本文将以此为基础。它将涵盖
- 用于忘记密码、重新发送代码和帐户详细信息的序列化程序。
- 相同 API 的视图。
- 当然还有网址。
我会尽力介绍尽可能多的细节,以免让您感到无聊,但我仍然希望您熟悉 Python 和 Django 的某些方面。
最终版本的源代码可以在https://github.com/saad4software/alive-diary-backend
系列订购
感兴趣的话可以查看之前的文章!
- 从头开始的人工智能项目、创意、Alive 日记
- 用 Google AI Studio 证明它是可行的
- Django API 项目设置
- Django账户管理(一)、注册与激活
- Django账户管理(二)、登录及修改密码
- 带有 Swagger 的 Django Rest 框架
- 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 上测试它
重置密码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...”
现在测试详细信息 API 应返回如图所示的帐户详细信息
就是这样!恭喜,您拥有一个功能齐全的帐户管理应用程序,只需进行最少的修改即可在任何 Django 应用程序中使用
您认为它还需要其他功能吗?请提出建议!
我们将在下一篇文章中回到主应用程序,所以
敬请期待?
以上是Django 帐户管理应用程序(忘记密码和帐户详细信息的详细内容。更多信息请关注PHP中文网其他相关文章!

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

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

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

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

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

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

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

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


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

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

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

记事本++7.3.1
好用且免费的代码编辑器

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