3

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

 2 years ago
source link: https://blog.51cto.com/u_15568258/5544036
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Table of Contents

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

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

二.werkzeug密码散列值

密码散列函数是一种 单向散列函数 ,将任意长度的消息压缩到某一固定长度的 消息摘要 ,一个理想的密码散列函数应该有四个主要的特性:对于任何一个给定的消息,它都很容易就能运算出散列数值。
werkzeug中的security模块实现了密码散列值的计算。
1.from werkzeug.security import check_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

如下:

Flask框架实现注册加密功能详解【Flask企业课学习】_插入图片_02

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("注册成功")
Flask框架实现注册加密功能详解【Flask企业课学习】_flask_03

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同理。
截图如下:

Flask框架实现注册加密功能详解【Flask企业课学习】_插入图片_04

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

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

{% block page_content %}
<div>
    请登记
    {% 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!

五.效果图

效果图如下:

Flask框架实现注册加密功能详解【Flask企业课学习】_flask_05
Flask框架实现注册加密功能详解【Flask企业课学习】_插入图片_06
Flask框架实现注册加密功能详解【Flask企业课学习】_flask_07
Flask框架实现注册加密功能详解【Flask企业课学习】_flask_08
Flask框架实现注册加密功能详解【Flask企业课学习】_插入图片_09

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK