19.-哈希算法&注册登录

class User(models.Model):
username = models.CharField('用户名', max_length=30, unique=True)
password = models.CharField('密码', max_length=32)
create_time = models.DateTimeField('创建时间', auto_now_add=True)
updata_time = models.DateTimeField('更新时间', auto_now=True) def __str__(self):
return f'username:{self.username}'
def register_view(request):
if request.method == 'GET':
return render(request, 'user/register.html')
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
password_verify = request.POST.get('password_verify')
# 判断两次密码是否一致
if password != password_verify:
return HttpResponse('两次输入密码不一致')
# 当前用户名是否可用
old_users = User.objects.filter(username=username)
if old_users:
return HttpResponse('当前用户名已经注册')
# 哈希算法转换密码
hash = hashlib.md5()
hash.update(password.encode())
hash_pwd = hash.hexdigest() # 插入数据
try:
user = User.objects.create(username=username, password=hash_pwd)
except Exception as e:
# 有可能报错,重复插入 唯一索引注意并发写入问题,所以有唯一索引一定要try一下
logger.error(f'register create user info {e}')
return HttpResponse('当前用户名已经注册') # 存储 session / 免登录一天
request.session['username'] = username
request.session['uid'] = user.id
# 修改session 有效期为1天
return HttpResponseRedirect('/index') def login_view(request):
if request.method == 'GET':
# 检查登录状态,如果登录了,显示已登录
if request.session.get('username') and request.session.get('uid'):
return HttpResponseRedirect('/index') # 检查cookie
c_username = request.COOKIES.get('username')
c_uid = request.COOKIES.get('uid')
if c_username and c_uid:
# 回写session
request.session['username'] = c_username
request.session['uid'] = c_uid
return HttpResponseRedirect('/index') return render(request, 'user/login.html')
if request.method == 'POST':
# 处理数据
username = request.POST.get('username')
password = request.POST.get('password')
# 比对用户名
try:
user = User.objects.get(username=username)
except Exception as e:
logger.error(f'longin user {e}')
return HttpResponse(f'用户名或密码不正确') # 判断密码
# 哈希算法转换密码
hash = hashlib.md5()
hash.update(password.encode())
# 密码比对
if hash.hexdigest() != user.password:
return HttpResponse('用户名或密码错误')
# 记录会话状态
request.session['username'] = username
request.session['uid'] = user.id
# 判断用户是否选中了记住当前用户
# -> cookies 存储username.id 3天
resp = HttpResponseRedirect('/index') if 'remember' in request.POST:
resp.set_cookie('username', username, 3600 * 24 * 3)
resp.set_cookie('uid', user.id, 3600 * 24 * 3) return resp def logout_viwe(request):
if 'username' in request.session:
del request.session['username']
if 'uid' in request.session:
del request.session['uid']
resp = HttpResponseRedirect('/index')
if 'username' in request.COOKIES:
resp.delete_cookie('username')
if 'uid' in request.COOKIES:
resp.delete_cookie('uid')
return resp
19.-哈希算法&注册登录的更多相关文章
- vue2.0+koa2+mongodb实现注册登录
前言 前段时间和公司一个由技术转产品的同事探讨他的职业道路,对我说了一句深以为然的话: "不要把自己禁锢在某一个领域,技术到产品的转变,首先就是思维上的转变.你一直做前端,数据的交互你只知道 ...
- Django+bootstrap+注册登录系统
转自:https://www.cnblogs.com/robindong/p/9610057.html Robin_D 博客园 首页 新随笔 联系 订阅 管理 随笔 - 10 文章 - 0 评论 ...
- Spring Security 的注册登录流程
Spring Security 的注册登录流程 数据库字段设计 主要数据库字段要有: 用户的 ID 用户名称 联系电话 登录密码(非明文) UserDTO对象 需要一个数据传输对象来将所有注册信息发送 ...
- 原生js验证简洁美观注册登录页面
序 一个以js验证表单的简洁的注册登录页面,不多说直接上图 效果 主要文件 完整代码 sign_up.html 注册表单 <!DOCTYPE html> <html lang=&qu ...
- 一致性哈希算法(consistent hashing)样例+測试。
一个简单的consistent hashing的样例,非常easy理解. 首先有一个设备类,定义了机器名和ip: public class Cache { public String name; pu ...
- Iconfinder 如何杜绝盗版,哈希算法检测图像重复
原地址:http://blog.jobbole.com/65914/ 本文由 伯乐在线 - 小鱼 翻译自 Silviu Tantos.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. [伯乐在线导读 ...
- Web存储—简易注册登录
Web Storage是HTML5引入的一个非常重要的功能,可以在客户端本地存储数据,类似HTML4的cookie,但可实现功能要比cookie强大的多,cookie大小被限制在4KB,cookie只 ...
- SHA1 安全哈希算法(Secure Hash Algorithm)
安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signatu ...
- SpringBoot注册登录(三):注册--验证账号密码是否符合格式及后台完成注册功能
SpringBoot注册登录(一):User表的设计点击打开链接SpringBoot注册登录(二):注册---验证码kaptcha的实现点击打开链接 SpringBoot注册登录(三):注册 ...
随机推荐
- [BJDCTF2020]Mark loves cat-1|源代码泄露|变量覆盖
主要考察了:源代码泄露.变量覆盖 共展示了三种获取flag的方式 1.打开题目查看未发现有效信息,查看源代码信息,发现返回的dog信息,结果如下: 2.使用dirmap进行目录扫描,发现了.git/c ...
- Blazor VS Vue
Vue--两分钟概述 Vue 是一个JavaScript 框架. 在其最简单的模式中,您可以简单地将核心 Vue 脚本包含在您的应用程序中,然后开始构建您的组件. 除此之外,对于更复杂的应用程序, ...
- CM311-1a(S905L3系列)玩转桌面
那安装了ambian后,玩转桌面(安装GUI桌面环境)有没有可能呢?那肯定啊!那桌面有什么用?当然有用,多一种玩法,可以写写代码,上网冲浪,学习linux语法什么的.而且单主机只要40左右,想想看可以 ...
- Python之验证码识别功能
Python之pytesseract 识别验证码 1.验证码来一个 2.适合什么样的验证码呢? 只能识别简单.静态.无重叠.只有数字字母的验证码 3.实际应用:模拟人工登录.页面内容识别.爬虫抓取信息 ...
- JS/java实现QQ空间自动点赞
使用方法: 1:进入QQ空间 2:复制下面代码 3:按F12或右键审查元素 进入控制台 也就是console 4:粘贴 回车键 喝口水 5:如果嫌慢的话可以 修改这段代码. window.setI ...
- 未完待续【java】JavaEE学习路线总览
这个博客会详细介绍各种技术的知识点,从零基础到入门,充当引路的作用. 同时也会发布一些Swift语言.c#语言.Xcode开发的学习笔记.一些阅读的笔记(部分读书笔记无法发布). 目前1-43的Jav ...
- OSI七层模型与TCP/IP协议
作者:菘蓝 时间:2022/9/1 ================================================================================== ...
- Html飞机大战(三):定义状态
好家伙, 1.为飞机大战定义状态 1.开始 START 有一个飞机大战LOGO &天空 2.开始时 STRATING 有一个飞机加载的界面&天空 3.运行时 RUNNING 我方飞机& ...
- 【Git进阶】基于文件(夹)拆分大PR
背景 前段时间为了迁移一个旧服务到新项目,由此产生了一个巨大的PR,为了方便Code Review,最终基于文件夹,将其拆分成了多个较小的PR:现在这里记录下,后面可能还会需要. 演示 为了方便演示, ...
- KMP&Z函数详解
KMP 一些简单的定义: 真前缀:不是整个字符串的前缀 真后缀:不是整个字符串的后缀 当然不可能这么简单的,来个重要的定义 前缀函数: 给定一个长度为\(n\)的字符串\(s\),其 \(前缀函数\) ...