配置映射类和数据库
直接贴一个实验楼的图来更好阐述整个流程。
图片版权为实验楼所有
我们之前说到了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的内容
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。这就说明我们的数据库基本地就配置好了