用flask开发个人博客(30)—— 用WerkZeug实现密码的加密存储

一 引言

        我们在进行用户的注册时,往往需要将用户输入的明文密码加密成密文进行存储。flask中使用WerkZeug模块可实现这一功能。WerkZeug中有两个方法:

generate_password_hash(password)和check_password_hash(hash,password)。前者用来将明文密码加密,返回加密后的密文,用来进行用户注册。后者将明文和密文进行比较

查看是否一致,用来验证用户登录。


二 模型中增加密文字段

        为了讨论WerkZeug的使用,我们先要在User的模型中加入密文字段,并替代之前的密码明文。并引入password属性和验证password的方法。
class User(db.Model):
    __tablename__='users'
    id=db.Column(db.Integer,primary_key=True)
    username=db.Column(db.String(64),unique=True,index=True)
    role_id=db.Column(db.Integer,db.ForeignKey('role.id'))
    hash_password=db.Column(db.String(28))

    def __repr__(self):
        return '<User %r>'% self.username

    @property
    def password(self):
        raise AttributeError('password cannot be read');

    @password.setter
    def password(self,password):
        self.hash_password=generate_password_hash(password)

    def confirm_password(self,password):
        return check_password_hash(self.hash_password,password)
第6行,我们定义了一个hash_password字段,用来保存加密后的密文。
第11~13行,将password字段定义为User类的一个属性,其中设置该属性不可读,若读取抛出AttributeError。
第15~17行,定义password字段的写方法,我们调用generate_password_hash将明文密码password转成密文hash_password。
第19和20行,定义验证密码的函数confirm_password。

三 视图函数中对密码进行加密和验证

        重新定义了User模型,接下来我们要在视图函数中定义对用户输入的明文密码进行加密和验证的方法。为了成功验证,在那之前,我们需要先在表单中增加password字段:
from flask_wtf import FlaskForm  
from wtforms import TextField,SubmitField,PasswordField  
from wtforms.validators import DataRequired  
  
class NameForm(FlaskForm):  
    name=TextField('what is your name?',validators=[DataRequired()])  
    password=PasswordField('what is your password?',validators=[DataRequired()])
    submit=SubmitField('Submit') 
        并且,在视图函数返回的html模板中进行相应的处理:
<form method="POST">  
	 {% for message in get_flashed_messages() %}
	 	<p>{{ message }}</p>
	 {% endfor %}
    {{form.hidden_tag()}}  
    <p>{{form.name.label}}</p>
    {{form.name()}}  
    <p>{{ form.password.label }}</p>
    {{ form.password() }}
    <br>{{form.submit }}  
</form>  
        我们要实 现的效果是:点击Web上的Submit按钮会新增一个用户,将密码转换成密文密码和用户名一起存入数据库,并且会flash一条'add a user'的信息。此时要求用户在输入一次密码,再次点击Submit按钮,会将验证密码是否正确,并flash对应的信息。视图函数的处理如下:
from datetime import datetime  
from flask import flash,render_template,session,redirect,url_for,current_app  

from . import main  
from .forms import NameForm  
from .. import db  
from ..models import User  
from .. import mail  
from ..email import msg  
 
 
@main.route('/',methods=['GET','POST'])  
def index():  
    form=NameForm()  
    if form.validate_on_submit():
        user=User.query.filter_by(username=form.name.data).first()  
        if user is None:  
            user = User(username=form.name.data,password=form.password.data)  
            db.session.add(user)
            flash('add a user')
        else:
            if user.confirm_password(form.password.data) is True:
                flash('password is right')
            else:
                flash('password is not right')
    return render_template('index.html',form=form)  
        完成上述步骤之后,我们来验证程序的执行。首先,填入用户名和密码,并点击Submit按钮:
        我们成功增加了一个用户Jerry,接下来验证密码的正确性。先输入一个错误的密码:


        再输入一个正确的密码:

        执行结果和我们预期的一致。



Github位置:
https://github.com/HymanLiuTS/flaskTs
克隆本项目:
Git clone git@github.com:HymanLiuTS/flaskTs.git
获取本文源代码:
git checkout FL30






Flask 是一个轻量级的 Python Web 框架,非常适合用来建立个人博客。以下是用 Flask 建立个人博客的简单步骤: 1. 安装 Flask 和其他必需的依赖库 可以使用 pip 安装 Flask 和其他必需的依赖库,例如 Flask-WTF、Flask-Login、Flask-Migrate 等。 2. 创建 Flask 应用程序 可以在 Python 脚本中创建 Flask 应用程序,例如: ``` from flask import Flask app = Flask(__name__) @app.route('/') def index(): return 'Hello, World!' if __name__ == '__main__': app.run() ``` 3. 创建数据库模型 可以使用 SQLAlchemy 创建数据库模型,例如: ``` from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(20), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) password = db.Column(db.String(60), nullable=False) def __repr__(self): return f"User('{self.username}', '{self.email}')" ``` 4. 创建表单和视图函数 可以使用 Flask-WTF 创建表单,使用视图函数处理表单提交和页面渲染,例如: ``` from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, Email, EqualTo, Length class RegistrationForm(FlaskForm): username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)]) email = StringField('Email', validators=[DataRequired(), Email()]) password = PasswordField('Password', validators=[DataRequired()]) confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')]) submit = SubmitField('Sign Up') @app.route('/register', methods=['GET', 'POST']) def register(): form = RegistrationForm() if form.validate_on_submit(): user = User(username=form.username.data, email=form.email.data, password=form.password.data) db.session.add(user) db.session.commit() flash('Your account has been created!', 'success') return redirect(url_for('login')) return render_template('register.html', title='Register', form=form) ``` 5. 创建模板 可以使用 Jinja2 模板引擎创建模板,例如: ``` <!DOCTYPE html> <html> <head> <title>{{ title }}</title> </head> <body> {% with messages = get_flashed_messages() %} {% if messages %} {% for message in messages %} <div>{{ message }}</div> {% endfor %} {% endif %} {% endwith %} <form method="POST"> {{ form.hidden_tag() }} <p> {{ form.username.label }}<br> {{ form.username() }} </p> <p> {{ form.email.label }}<br> {{ form.email() }} </p> <p> {{ form.password.label }}<br> {{ form.password() }} </p> <p> {{ form.confirm_password.label }}<br> {{ form.confirm_password() }} </p> <p>{{ form.submit() }}</p> </form> </body> </html> ``` 6. 部署应用程序 可以使用 gunicorn 或 uwsgi 等工具部署 Flask 应用程序到服务器上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值