Flask框架实现注册加密功能详解【Flask企业课学习】
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.
Table of Contents
本学期开了为期一个月的flask框架基础课,前面的知识之前都有接触过,最近的综合运用Flask框架的flask-bootstrap模板 、Flaskform表单和flask-sqlalchemy数据库框架实现基本注册功能和使用werkzeug密码散列计算实现注册的密码安全性。也是第一次接触。
涉及的内容:
1.能够综合运用Flask框架的flask-bootstrap模板 、Flaskform表单和flask-sqlalchemy数据库框架实现基本注册功能
2.能够使用werkzeug密码散列计算实现注册的密码安全性
二.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
如下:
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>
请登记
{% 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!
五.效果图
效果图如下:
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK