Flask从入门到做出一个博客的大型教程(四)
在开始之前,先来看下项目的整体结构。
flask
├── app
│ ├── forms.py
│ ├── __init__.py
│ ├── models.py
│ ├── routes.py
│ └── templates
│ ├── base.html
│ ├── index.html
│ └── login.html
├── config.py
├── migrations
│ ├── alembic.ini
│ ├── env.py
│ ├── README
│ ├── script.py.mako
│ └── versions
│ ├── 3884184ade03_tables.py
├── myblog.py
5 用户登录模块
在上一部分讲了数据库,也建立了表,但是用户表里的密码字段一直没用,所以这里讲一讲密码字段。如果密码不加密就明文存储在数据库中,这是一个非常不安全而且愚蠢的行为,所以咱们要一起先看看密码的加密存储。
(venv) duke@coding:~/flask_tutorial/flask$ flask shell
Python 3.6.4 (default, May 3 2018, 19:35:55)
[GCC 5.4.0 20160609] on linux
App: app [production]
Instance: /home/duke/flask_tutorial/flask/instance
>>> from werkzeug.security import generate_password_hash
>>> hash = generate_password_hash('mima')
>>> hash
'pbkdf2:sha256:50000$S9FPhxbX$4f164ff06b409769e44556bcd9d8f906ca82998e433410f85898245e40ecd4d3'
这样就对密码进行了加密,存储在数据库中。但是用户登录输入的密码要怎么和存储在数据库中的这一大串密码进行比对呢?这是就要用到另外一个函数了。
>>> from werkzeug.security import check_password_hash
>>> check_password_hash(hash,'haha')
False
>>> check_password_hash(hash,'mima')
True
这样就可以根据返回的布尔值来判断用户输入的密码是否正确了。既然掌握了密码的加密和核对,那么就要model进一步完善了。
app/models.py : 完善user模型
# ...
from werkzeug.security import generate_password_hash, check_password_hash
class User(db.Model):
# ...
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
user模型修改好了,现在到flask shell中去试一试是否成功能用?
(venv) duke@coding:~/flask_tutorial/flask$ flask shell
Python 3.6.4 (default, May 3 2018, 19:35:55)
[GCC 5.4.0 20160609] on linux
App: app [production]
Instance: /home/duke/flask_tutorial/flask/instance
>>> from app.models import User
>>> u = User(username='duke'