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

来源:互联网 发布:ubuntu chrome 编辑:程序博客网 时间:2024/06/06 04:22

在用户注册中,我们需要把账号密码存储到数据库中,为了账号安全,需要对密码进行加密。在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模型中添加一些密码验证的辅助代码:

#明文密码(只读)@propertydef password(self):    raise AttributeError(u'文明密码不可读')#写入密码,同时计算hash值,保存到模型中@password.setterdef password(self,value):    self.hashpass=generate_password_hash(value)#检查密码是否正确def check_login_password(self,password):    return check_password_hash(self.hashpass,password)

0x03 验证视图

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

#Login Formclass 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 0
原创粉丝点击