Flask学习总结笔记(10) -- 利用Werkzeug实现账号密码加密存储

在用户注册中,我们需要把账号密码存储到数据库中,为了账号安全,需要对密码进行加密。在Flask中,Werkzeug中的security模块能够很方便地实现密码加密计算。

0x01 相关函数

generate_password_hash(password,method=pdkdf2:sha1,salt_length=8)

函数将原始密码作为输入参数,以字符串形式输出密码的散列值,method和salt_length一般采用默认值就可以了。

check_password_hash(hash,password)

函数讲原始密码与加密后的hash进行对比,返回值为True表示输入的明文密码是正确的。

0x02 数据模型

class Users(db.Model):
    __tablename__='users'
    id=db.Column(db.Integer,primary_key=True)
    username=db.Column(db.String(255),nullable=False,index=True)
    hashpass=db.Column(db.String(255),nullable=False)

在Users模型中添加一些密码验证的辅助代码:

#明文密码(只读)
@property
def password(self):
    raise AttributeError(u'文明密码不可读')

#写入密码,同时计算hash值,保存到模型中
@password.setter
def password(self,value):
    self.hashpass=generate_password_hash(value)

#检查密码是否正确
def check_login_password(self,password):
    return check_password_hash(self.hashpass,password)

0x03 验证视图

为了验证,定义如下表单:

#Login Form
class LoginForm(Form):
    email=StringField(u'email',validators=[DataRequired,
                                           Length(1,64),
                                           Email()])
    password=PasswordField(u'password',validators=[DataRequired])
    remeber=BooleanField(u'remeber me')

模板文件:

{%extends 'base.html'%}
{%import 'bootstrap/wtf.html' as wtf%}
{%block title%}用戶登录{%endblock%}
{%block page_content%}
<div class="container">
    <div class="page-header">
        <h3>Loginh3>
    div>
    <div class="col-lg-4">
        {%for message in get_flashed_messages()%}
        <div class="alert alert-warning">
            <button type="button" class="close" data-dismiss="alert">×button>
            <span>{{message}}span>
        div>
        {%endfor%}
        <form method="post">
        {{form.hidden_tag()}}
        {{wtf.form_field(form.email)}}
        {{wtf.form_field(form.password)}}
        <div class="checkbox">
            <label>{{form.remeber}}remeber melabel>
            <a href="{{url_for('auth.request_reset_password')}}" class="pull-right">find passworda>
        div>
        <button type="submit" class="btn btn-primary form-control">Loginbutton>
    form>
    div>
div>
{%endblock%}

视图函数的处理过程如下:

#login
@auth.route('/login/',methods=['POST','GET'])
@auth.route('/',methods=['POST','GET'])
def login():
    if current_user.is_authenticated:
        return redirect(url_for('main.index'))
    form=LoginForm()
    if form.validate_on_submit():
        user=db.session.query(Users).filter(Users.email==form.email.data).first()
        if user and user.check_login_password(form.password.data):
            login_user(user,form.remeber.data)
            return redirect(request.args.get('next') or url_for('main.index'))
        else:
            flash('email or password is error')
    return render_template('auth/login.html',form=form)

访问效果如下:

Flask学习总结笔记(10) -- 利用Werkzeug实现账号密码加密存储_第1张图片

当账号密码正确时,将发生跳转。上面的验证实例是在前面蓝本模型的基础上完成的。使用Werkzeug来完成密码加密存储,可以为我们节省很多工作量。

你可能感兴趣的:(Flask)