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加密密码 然后实现登录状态的维持就实现了