Flask框架实现注册加密功能详解【Flask企业课学习】

上进小菜猪 发表于 2022/06/17 18:31:56 2022/06/17
【摘要】 @[toc] 一.前言本学期开了为期一个月的flask框架基础课,前面的知识之前都有接触过,最近的综合运用Flask框架的flask-bootstrap模板 、Flaskform表单和flask-sqlalchemy数据库框架实现基本注册功能和使用werkzeug密码散列计算实现注册的密码安全性。也是第一次接触。涉及的内容:1.能够综合运用Flask框架的flask-bootstrap模板 ...

@[toc]

一.前言

本学期开了为期一个月的flask框架基础课,前面的知识之前都有接触过,最近的综合运用Flask框架的flask-bootstrap模板 、Flaskform表单和flask-sqlalchemy数据库框架实现基本注册功能和使用werkzeug密码散列计算实现注册的密码安全性。也是第一次接触。
涉及的内容:
1.能够综合运用Flask框架的flask-bootstrap模板 、Flaskform表单和flask-sqlalchemy数据库框架实现基本注册功能
2.能够使用werkzeug密码散列计算实现注册的密码安全性
在这里插入图片描述

二.werkzeug密码散列值

密码散列函数是一种 单向散列函数 ,将任意长度的消息压缩到某一固定长度的 消息摘要 ,一个理想的密码散列函数应该有四个主要的特性:对于任何一个给定的消息,它都很容易就能运算出散列数值。
werkzeug中的security模块实现了密码散列值的计算。
1.from werkzeug.security importcheck_password_hash,generate_password_hash
generate_password_hash函数的输入为原始密码,返回密码散列值的字符串形式,供存入用户数据库。
check_password_hash数据库中存放的密码hash值,和用户输入的密码,如果一致,返回True,如果不一致,返回False。
用户前端输入,传值给后端,密码字段传入password函数,执行generate_password_hash
方法,返回密码散列值的字符串形式。函数 check_password_hash 检查给出的hash密码与传入的密码是否相符。如果一致,返回True,如果不一致,返回False。

三.后端详解

3.1准备

引入werkzeug中的security模块,

from werkzeug.security import check_password_hash,generate_password_hash

引入FlaskForm模块

from flask_wtf import Form, FlaskForm

引入SQLAlchemy模块

from flask_sqlalchemy import SQLAlchemy

3.2创建数据库

先创建一下我们的数据库:

class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer,  primary_key = True)
    name = db.Column(db.String(64),  unique=True)
    users = db.relationship('User', backref='role')
    def __repr__(self):
        return '<Role %r>' % self.name

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True)
    password_hash = db.Column(db.String(128))
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
    def __repr__(self):
        return '<User %r>' % self.name

如下:
在这里插入图片描述

3.4 register视图函数

if user is None:
            user = User(username=form.name.data,password=form.password.data)

如果传入的值不为空的话,将前端传递的username和password作为参数传入User()

User()方法处理加密后的字段返回赋值给user。
存入数据库:

db.session.add(user)

将known赋值为False,响应给前端

session['known'] = False

前端输出提示信息:注册成功

flash("注册成功")

在这里插入图片描述

3.5 使用Flaskform编写register表单代码

class RegisterForm(FlaskForm):
    name = StringField('Username', validators=[InputRequired(),Length(min=8,max=16)])
    password=PasswordField('New Password',validators=[InputRequired(),
                                                      Length(min=8,max=16),
                                                      EqualTo('confirm',message='Passwords must match')])
    confirm = PasswordField('Repeat Password')
    submit = SubmitField('submit')

上述代码解释:
这块比较简单一些,作用就是规定了name表单的最小输入为8个字符,最大为16个字符,password同理。
截图如下:
在这里插入图片描述

四,前端

4.1使用flask-bootstrap模板完成register.html页面渲染代码

{% extends "base.html"%}
{% import "bootstrap/wtf.html"as wtf %}
{% block title %}Flask{% endblock %}

{% block page_content %}
<div>
    <h1>请登记</h1>
    {% if not known %}
    <p>Pleased to meet you!</p>
    {% else %}
    <p>Happy to see you again!</p>
    {% endif %}
</div>
{{ wtf.quick_form(form) }}
{% endblock %}

之前后端写过,传值到前端 known,如果通过的话赋值 known为False,前端这里,如果判断为当前为数据库里存在的用户,会输出Happy to see you again!

五.效果图

效果图如下:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。