栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

django搭建博客九用户密码重置

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

django搭建博客九用户密码重置

页面模板

新建myblogtemplatesuserregister.html

{% extends 'base.html' %}
{% load static %}
{% block title %}密码重置{% endblock %}
{% block main %}
    
    
{% endblock %}

页面效果:

密码重置邮件

编辑myblogsystemtools.py

内容如下,RegisterActiveEmailSender继承之前封装的EmailSender,重写了get_template_context函数,实现了注册激活需要的参数逻辑。

from django.urls import reverse
from django.utils.crypto import get_random_string
from system.models import EmailRecord, User
from django.core.mail import send_mail
from django.template.loader import render_to_string
from myblog.email_settings import EMAIL_FROM
from myblog.settings import SITE_URL, SITE_NAME
import logging

logger = logging.getLogger(__name__)

...

"""
密码重置邮件发送器
"""

class PasswordResetEmailSender(EmailSender):
    template_name = "user/email-password-reset.html"

    def get_template_context(self):
        context = super(PasswordResetEmailSender, self).get_template_context()
        self.record.url = self.site_url + reverse(viewname='sys:reset_password') + f"?code={self.record.code}"
        context.update({"url": self.record.url})
        return context
密码重置邮件任务

新增myblogsystemtasks.py

添加以下内容,需要注意这里文件名必须为tasks.py,便于后面celery的自动任务发现机制。可以看到下面发送邮件是区分了两种环境的。

如果是DEBUG=False(生产环境)的情况下则是交给celery异步发送邮件,同时在之前prod_settings.py里面已经配置过 EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"。

而在DEBUG=True(开发环境)则是同步发送且因为在dev_settings.py里面定义了

EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend" ,邮件直接输出在控制台,便于开发调试。

from celery import shared_task
from django.conf import settings
from system.models import EmailType
from system.tools import RegisterActiveEmailSender, PasswordResetEmailSender
import logging

logger = logging.getLogger("django")


@shared_task
def _send_email(email_type=None, username=None, *args, **kwargs):
    if email_type == EmailType.ACTIVE:
        RegisterActiveEmailSender(EmailType.ACTIVE, username).send(*args, **kwargs)
    elif email_type == EmailType.RESET:
        PasswordResetEmailSender(EmailType.RESET, username).send(*args, **kwargs)


def send_email(email_type=None, username=None, *args, **kwargs):
    if settings.DEBUG:
        _send_email(email_type, username, *args, **kwargs)
    else:
        _send_email.delay(email_type, username, *args, **kwargs)
密码重置表单

编写myblogsystemforms.py

添加以下内容,需要注意这里面使用到了django-simple-captcha依赖,如下面的

from captcha.fields import CaptchaField,这个在之前初始化工程的时候已经安装了开发环境下需要的依赖了。

from django import forms
from django.core import validators

from system.models import User
import logging

logger = logging.getLogger('django')


class ResetPasswordForm(forms.Form):
    email = forms.EmailField(required=True, max_length=30, error_messages={'require': "请输入邮箱地址"})
    password = forms.CharField(required=True, error_messages={'require': "请输入密码"}, min_length=5, max_length=18,
                               validators=[
                                   validators.RegexValidator(regex=r'[w.@+-_?&%$)!]{6,18}$',
                                                             message="请输入合法的密码")])

    def clean_email(self):
        email = self.cleaned_data.get('email')
        if email is not None:
            exists = User.objects.filter(email=email).exists()  # 之所以用filter是因为如果用get若不存在则会报错
            if not exists:
                logger.info("【{email}】邮箱不存在!".format(email=email))
                raise forms.ValidationError("邮箱不存在!")
        return email
密码重置视图

编写myblogsystemviews.py

添加以下内容

import logging

from django.shortcuts import render, redirect
from django.urls import reverse
from django.views.generic.base import View

from system import forms
from system.models import EmailRecord, User

logger = logging.getLogger('django')

class ResetPasswordView(View):

    def get(self, request):
        code = request.GET.get("code", None)
        try:
            record = EmailRecord.objects.get(code=code)
            return render(request, "user/reset.html", {"email": record.receiver.email})
        except EmailRecord.DoesNotExist:
            logger.info("【{code}】激活验证码不存在!".format(code=code))
            return redirect("/")

    def post(self, request):
        reset_form = forms.ResetPasswordForm(request.POST)
        if reset_form.is_valid():
            email = reset_form.cleaned_data['email']
            password = reset_form.cleaned_data['password']
            user = User.objects.get(email=email)
            user.set_password(password)
            user.save()
            return redirect(reverse("sys:login"))
        return render(request, 'user/reset.html', {'reset_form': reset_form})
路由绑定

编辑myblogsystemurls.py

添加以下内容

from django.urls import path
from system import views

urlpatterns = [
    path('user/reset_password', views.ResetPasswordView.as_view(), name='reset_password'),
]

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/935649.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号