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>Login</h3>
    </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">&times;</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 me</label>
            <a href="{{url_for('auth.request_reset_password')}}" class="pull-right">find password</a>
        </div>
        <button type="submit" class="btn btn-primary form-control">Login</button>
    </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)

访问效果如下:

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

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值