django简易的登录 注册 以及使用itsdangerous加密 session登录状态的维持

itsdangerous加密:

在开发过程中会遇到一些需要用户激活使用的链接
这些需要带有用户的相关信息
又不希望这些信息以明文的方式展现给用户
防止不放分子从中作恶
这时就可以使用itsdangerous来对数据进行加密
之后再对加密的数据进行解密得到用户信息
从而对该用户进行激活认证

views.py中实现登录以及注册功能

from django.shortcuts import render
from django.views import View
from django.http import HttpResponse
from itsdangerous import TimedJSONWebSignatureSerializer as SE
from itsdangerous import SignatureExpired  # 导入异常报错模块
from TY.settings import SECRET_KEY  #密钥
import time
from .models import Users
# Create your views here.


#注册
class RegisterResponse(View):
    def get(self,request):
        return render(request,"zuoye/register.html")

    def post(self,request):
        #1-从前端拿到数据
        username = request.POST.get("username")
        password = request.POST.get("password")
        #2-判断数据 当数据太少时 直接判断  不使用forms.py中的form类

        if not (username and password):
            return HttpResponse("用户名以及密码不能为空")

        #3-对密码加密
        Serializer = SE(SECRET_KEY, 60000) # 要加密的方式 ,加密的时间 加密对象

        info = {username:password}  # 要加密的内容
        ret = Serializer.dumps(info)  # 执行加密(加密内容)
        token = ret.decode()  #解密编码方式
        #print(token)
        #time.sleep(3)
        """#解密
        try:
            result = Serializer.loads(token)  # 解密之前加密的变量
            print(result.get(username))  # 解密后显示加密内容
        except SignatureExpired as e:
            print(e)  # 抛出激活日期已过期
        """
        #4-存入数据库

        Users.objects.create(username=username,password=token)
        return HttpResponse("注册成功!!")

#登录
class LoginResponse(View):
    def get(self,request):
        return render(request,'zuoye/login.html')
    def post(self,request):
        #1-获取前端用户名以及密码
        username = request.POST.get("username")
        password = request.POST.get("password")
        remember = request.POST.get("remember") #记住我
        #print(remember) #点击时为ON 不点击时为None
        # 2-跟数据库中判断
        #解密
        Serializer = SE(SECRET_KEY, 60000)
        user = Users.objects.filter(username=username).first()
        if user:
           user_password = user.password #数据库里的密码
           try:
               result = Serializer.loads(user_password).get(username)  # 解密之前加密的变量
               #print(result)  # 解密后显示加密内容
               #print("============")
               if result ==password:
                   # 3-用户状态
                   if remember:
                       username = request.POST.get("username")
                       request.session["username"] = username
                       request.session.set_expiry(7*24*3600)
                   else:
                       request.session.set_expiry(0)
                   return HttpResponse("登录成功")
               else:

                   return HttpResponse("登录有误")
           except SignatureExpired as e:
               print(e)  # 抛出激活日期已过期


        else:
            return HttpResponse("用户名错误")

urls.py文件中

from django.urls import path
from . import views
name_app = "zuoye"
urlpatterns = [
    path('register/',views.RegisterResponse.as_view(),name="register"),
    path('login/',views.LoginResponse.as_view(),name="login"),
]

templates中下的zuoye目录下分别有login.html register.html

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <input type="text" name="username" placeholder="请输入用户名"><br>
    <input type="password" name="password" placeholder="请输入密码"><br>
    <input type="checkbox" name="remember">记住我 <br>
    <input type="submit" value="提交登录"><br>
</form>
</body>
</html>

register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <input type="text" name="username" placeholder="请输入用户名"><br>
    <input type="password" name="password" placeholder="请输入密码"><br>
    <input type="submit" value="提交注册"><br>

</form>
</body>
</html>

效果演示:

注册:

在这里插入图片描述
在这里插入图片描述
在数据库中查找数据
在这里插入图片描述
登录:
一开始登录状态为
在这里插入图片描述
登录后:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一个简易的登录 注册 以及使用itsdangerous加密密码 然后实现登录状态的维持就实现了

猜你喜欢

转载自blog.csdn.net/qq_42662411/article/details/104791222