利用Flask搭建一个简易的博客网站(4)

配置映射类和数据库

直接贴一个实验楼的图来更好阐述整个流程。
图片版权为实验楼所有

我们之前说到了MVT model, 即整个服务的基本架构是由 model,view,template来实现的。那我们就开始model部分的回顾吧!

如图所示,M模型的功能是映射类(ORM),即对数据库(我们使用的是MySQL)进行交互。为了更加便捷得能够与数据库进行交互,避免直接使用SQL语句查询,我们可以利用 flask-sqlalchemy插件来进行ORM的部署,它是专门为flask提供支持的sqlalchemy拓展。简单来说,如果不使用它,我们就必须自己搭建ORM,这就涉及到python的元组(metaclass)和动态创建类的内容了 (我这里当时自学时没有懂 = =)

既然有现成的工具,我们就需要好好利用它(为自己的笨找到了看似合理的借口 :) )。

pip install flask-sqlalchemy pip install flask-moment

首先安装相关的插件,再进入model.py 中import这些插件,并添加如下的代码。
可以先忽略具体的表中 某些Column的内容

1
2
3
4
5
6
7
8
9
10
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Role(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
default = db.Column(db.Boolean, default=False, index=True)
permissions = db.Column(db.Integer)

def __repr__(self):
return '<Role: {}>'.format(self.name)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class User(db.Model, UserMixin):
def __init__(self, **kw):
'''default role'''
# inherit the core of ORM
super().__init__(**kw)
self.role = Role.query.filter_by(default=True).first()

# necessary
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True, index=True)
email = db.Column(db.String(64), unique=True, index=True) # index helps to do query in front

# info related
_password = db.Column('password', db.String(128))
confirmed = db.Column(db.Boolean, default=False)
role_id = db.Column(db.Integer, db.ForeignKey('role.id'))
role = db.relationship('Role', backref=db.backref('users', lazy='dynamic'))

# personalize
age = db.Column(db.Integer)
gender = db.Column(db.Enum(Gender))
phone_num = db.Column(db.String(32), unique=True)
location = db.Column(db.String(64))
about_me = db.Column(db.Text())
avatar_hash = db.Column(db.String(128))
small_avatar_hash = db.Column(db.String(128))

# other
create_at = db.Column(db.DateTime, default=datetime.utcnow())
last_seen = db.Column(db.DateTime, default=datetime.utcnow())

# getter
@property
def password(self):
return self._password

关于最后这两个方法,一个是password的getter, 一个是 password的setter

这User类便是一个经典的ORM映射关系的实现,即一个类映射到数据库的一个表。

Role表名默认为类名,这个表内有这几个Column:id, name, default, permissions。 __repr__是用来显示这个类的实例,即表的某个row(在这里是具体的某个权限)。我们显示 <Role: self.name> 来代表这个权限。

相应的, user类代表的是user表,某个row代表的是具体的用户,每个row都需要有对用的id, name, email, password信息。db.Column()第一个参数是这个column的类型或者是名字,具体的信息可以查阅官方文档:

https://flask-sqlalchemy.palletsprojects.com/en/2.x/models/

这样,基础的映射类就创建好了,我们现在需要创建相对于的数据库(表)

进入mysql command line, 登录, 并且输入CREATE SCHEMA flaska CHARSET = UTF8 , 通过mysql语句创建新的数据库。再进入flask shell,

from models import db db.create_all()

这样再查询mysql 中的表,就会出现 Role 和 User。这就说明我们的数据库基本地就配置好了


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!