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

django搭建博客八用户登录

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

django搭建博客八用户登录

页面模板

新建myblogtemplatesuserlogin.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 RegisterActiveEmailSender(EmailSender):
    template_name = "user/email-register-active.html"

    def get_template_context(self, password=""):
        context = super(RegisterActiveEmailSender, self).get_template_context()
        self.record.url = self.site_url + reverse(viewname='sys:register_active', kwargs={'code': self.record.code})
        context.update({"url": self.record.url, "password": password})
        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
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)
    else:
        pass


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 django import forms
from django.contrib.auth.validators import validators
from django.db.models import Q
import logging

from system.models import User

logger = logging.getLogger('django')

class UserLoginForm(forms.Form):
    username = forms.CharField(required=True, error_messages={'require': "请输入用户名或者邮箱"}, max_length=30, min_length=2,
                               validators=[validators.RegexValidator(regex=r'^[u4E00-u9FA5A-Za-z0-9@.]{2,20}$',
                                                                     message="用户名只能包括中文,数字以及符号@.")])
    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_username(self):
        username = self.cleaned_data.get('username', '')
        try:
            user = User.objects.get(Q(username=username) | Q(email=username))
            if not user.is_active:
                raise forms.ValidationError("用户未激活")
        except User.DoesNotExist:
            logger.info("【{username}】用户名或者邮箱不存在!".format(username=username))
            raise forms.ValidationError("用户名或者邮箱不存在!")
        return username

    def clean(self):
        clean_data = super().clean()
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')
        if not username is None and password is not None:
            try:
                user = User.objects.get(Q(username=username) | Q(email=username))
                if not user.check_password(password):
                    logger.info("【{username}】登陆密码不正确!".format(username=username))
                    raise forms.ValidationError("登陆密码不正确")
            except User.DoesNotExist:
                pass
        return clean_data
登陆和登出视图

编写myblogsystemviews.py

添加以下内容

import logging

from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render, redirect
from django.views.generic.base import View

from system import forms

logger = logging.getLogger('django')


class UserLoginView(View):

    def get(self, request):
        return render(request, "user/login.html", {'next_to': request.GET.get('next_to', '/')})

    def post(self, request):
        next_to = request.POST.get('next_to', '/')
        login_form = forms.UserLoginForm(request.POST)
        if login_form.is_valid():
            username = login_form.cleaned_data['username']
            password = login_form.cleaned_data['password']
            user = authenticate(username=username, password=password)
            login(request, user)
            logger.info("用户{username}登录成功".format(username=username))
            return redirect(next_to)
        logger.info("登陆表单验证未通过")
        return render(request, "user/login.html", {'login_form': login_form, 'next_to': next_to})


class UserLoginOutView(View):

    def get(self, request):
        next_to = request.GET.get('next_to', '/')
        logout(request)
        logger.info("用户{username}退出登录".format(username=request.user.username))
        return redirect(next_to)
路由绑定

编辑myblogsystemurls.py

添加以下内容

from django.urls import path
from system import views

urlpatterns = [
    path('login', views.UserLoginView.as_view(), name='login'),
    path('logout', views.UserLoginOutView.as_view(), name='logout'),
]
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/926062.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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