django 注册 登录 用户激活模块

Django官网

Django源码

Django文档

 

一 模型model.py

使用django默认的认证系统

1. 创建超级用户

python manage.py createsuperuser

2.建立用户模型类,继承 AbstractUser

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    "用户模型类型"
    pass
    class Meta:
        db_table = 'user'
        verbose_name = '用户'
        verbose_name_plural = verbose_name

 

二 视图views.py

1.注册模块

流程:

接收参数>>>验证数据的完整性>>>验证密码和确认密码是否一致>>>验证邮箱是是否正确(正则)>>>查看用户是否已经注册>>>将用户信息保存到数据库中>>>对用户信息进行加密并发送邮件任务

# -*- encoding=utf-8 -*-
# Author: Kevin
# @Time: 2019/08/20 21:21
import re

from django.conf import settings
from django.shortcuts import render, redirect
from django.urls import reverse
from django.views import View
from itsdangerous import Serializer

from apps.user.models import User
from celeryTask.task import send_register_active_email

# 邮箱正则表达式
emailRegex = re.compile(r'^[a-z0-9]+(?:\.{0,1}[\w|-]+)*@[\w|-]+\.[a-z]{2,}(?:\.{0,1}[\w|-]+)*$')


class Register(View):
    """注册视图"""

    def get(self, request):
        """get请求注册页面,直接返回html"""
        return render(request, "register.html")

    def post(self, request):
        """post请求注册页面,注册用户信息"""
        # 接收表格POST过来的参数
        userName = request.POST.get("userName")  # 用户名
        passWord = request.POST.get("password")  # 密码
        checkWord = request.POST.get("checkPassWord")  # 确认密码
        emailAddress = request.POST.get("emailAddress")  # 注册邮箱

        # 校验数据的完整性 对form参数检验,缺一不可
        if not all([userName, passWord, checkWord, emailAddress]):
            return render(request, "register.html", {"errmsg": "用户名,密码,确认密码和邮箱缺一不可"})

        # 验证密码和确认密码是否一致
        if passWord != checkWord:
            return render(request, "register.html", {"errmas": "两次输入的密码不一样"})

        # 验证邮箱是否正确
        if not emailRegex.match(emailAddress):
            return render(request, "register.html", {"errmsg": "邮箱格式错误"})

        # 查看用户名是否已经注册了
        try:
            user = User.objects.get(username=userName,is_active=1)
        except Exception as e:
            user = None
        if user != None:
            return render(request, "register.html", {"errmsg": "该用户名[{}]已注册".format(user)})

        # 到了这一步代表输入用户名和密码都属于合理,可以进入注册
        # 现将用户信息记录到数据库中
        user = User.objects.create_user(userName, emailAddress, passWord)
        user.is_active = 0  # 是否激活状态设置为0  代表没有激活状态
        user.save()

        # 对用户信息进行加密
        serializer = Serializer(settings.SECRET_KEY, 3600)
        info = {'confirm': user.id}
        # 返回bytes类型
        token = serializer.dumps(info)
        # 转成str类型
        token = token.decode()

        # 使用celery发出发送邮件任务
        send_register_active_email.delay(emailAddress, userName, token)

        return redirect(reverse("goods:index"))

 

2.激活用户模块

激活流程:

判断激活连接是否失效>>>激活用户

# -*- encoding=utf-8 -*-
# Author: Kevin
# @Time: 2019/08/20 21:21

from django.conf import settings
from django.http import HttpResponse
from django.shortcuts import redirect
from django.urls import reverse
from django.views import View
from itsdangerous import Serializer, SignatureExpired

from apps.user.models import User


class ActiveView(View):
    def get(self, request, token):
        """
        :param request: 
        :param token: 用户加密信息token
        :return: 
        """
        # 对用户信息进行解密
        serializer = Serializer(settings.SECRET_KEY, 3600)
        try:
            # 解密
            info = serializer.loads(token)
            # 获取待激活用户id
            user_id = info['confirm']
            # 激活用户
            user = User.objects.get(id=user_id)
            user.is_active = 1
            user.save()
            # 跳转登录页面
            return redirect(reverse('user:login'))
        except SignatureExpired as e:
            # 激活链接已失效 重新发送激活连接进行激活
            return HttpResponse('激活链接已失效,需要重新激活信息')

 

3.登录模块

流程:接收参数>>>验证数据的完整性>>>登录校验(校验用户名和密码)>>>用户是否激活>>>登陆成功后跳转url>>>是否几乎用户名和密码>>>设置cookies

# -*- encoding=utf-8 -*-
# Author: Kevin
# @Time: 2019/08/20 21:21

from django.contrib.auth import authenticate, login
from django.shortcuts import redirect, render
from django.urls import reverse
from django.views import View


class Login(View):
    def get(self, request):
        """get请求登录页面"""
        # 判断用户是否记住用户名放在缓存中
        username = request.COOKIES.get('userName')
        if username == None:
            # 用户名为空,没有记住用户名
            username = ""
            checked = ""
        else:
            # 记住了用户名
            checked = "checked"
        return render(request, 'login.html', {"username": username, "checked": checked})

    def post(self, request):
        """post请求登录页面进行登录请求"""
        # 接收参数  用户名  密码  是否勾选记住用户名
        userName = request.POST.get("userName")  # 用户名
        passWord = request.POST.get("passWord")  # 密码
        remember = request.POST.get('remember')  # 是否记住用户名

        # 校验参数的完整性,只需要验证用户名和密码就可以了
        if not all([userName, passWord]):
            return render(request, "login.html", {"errmsg": "数据不完整,用户名和密码缺一不可"})

        # 登录校验
        user = authenticate(username=userName, password=passWord)
        # 检测用户是否存在
        if user == None:
            return render(request, "login.html", {"errmsg": "用户名或者密码错误"})
        else:
            # 检测用户是否激活
            if not user.is_active:
                return render(request, "login.html", {"errmsg": "用户已经注册,但是没有激活,请重新注册"})
            else:
                login(request, user)  # 记住登录状态

                # 获取用户登录之后访问的url地址,默认跳转到首页
                next_url = request.GET.get('next', reverse('goods:index'))  # None
                # 跳转到next_url
                response = redirect(next_url)

                # 判断是否记住用户名和密码
                if remember == "on":
                    response.set_cookie("username", userName, max_age=10 * 24 * 3600)
                else:
                    response.delete_cookie("username")
                return response

4.登出模块

流程:

退出登录>>>跳转到登录页面

# -*- encoding=utf-8 -*-
# Author: Kevin
# @Time: 2019/08/20 21:21
from django.contrib.auth import logout
from django.shortcuts import redirect
from django.urls import reverse
from django.views import View


class Logout(View):
    def get(self, request):
        """退出登录请求"""
        logout(request)
        # 重定向到登录页面
        return redirect(reverse("user:login"))

 

三 模板html

1.判断登录或者非登录状态

{% if user.is_authenticated %}
    <div class="login_btn fl">
        欢迎您:<em>{{ user.username }}</em>
        <span>|</span>
        <a href="{% url 'user:logout' %}">退出</a>
    </div>
{% else %}
    <div class="login_btn fl">
        <a href="{% url 'user:login' %}">登录</a>
        <span>|</span>
        <a href="{% url 'user:register' %}">注册</a>
    </div>
{% endif %}

 

个人博客地址,敬请关注    http://techgrip.car.blog

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值