对于我们开发人员来说,一般推荐使用Code First ,因为可以专注业务模型的设计 而不是数据库设计 , 数据库只是用来存数据的 ,它的表关系应该由我们业务来决定。
那么其他两种数据表创建方式可以自己上网查询相关资料,这里不再赘述。
之前提过一个叫做验证层,现在引入模型层(MVC中的M:模型层)
设计模型的思维,应该考虑业务模型,而不要去过多注意数据库的设计,数据库只是存数据的。
app文件夹下新建models文件夹并新建一个名为book.py的模型:
这里使用sqlalchemy这个包来做模型映射,还有一个包叫做flask_sqlalchemy,是flask在sqlalchemy的基础上做了一些自己的封装,待会我们也要用到。
再介绍一个第三方的独立的包:WTFORMS,Flask也针对这个包做了封装并有一个新的包叫做Flask_WTFORMS,以上两个(sqlalchemy、WTFORMS)是独立的两个包,可以用在任何时候而不仅仅在Flask中。
Flask的路由是在werkzeug基础上封装的
Flask是微框架,只提供最核心的功能其他部分可以自由组装
所有flask插件都必须和flask核心对象app绑定在一起
以上代码就是一个简单的创建数据表的模型,包含四个字段,
之前提到过,所有的Flask的插件都需要和Flask的核心对象app来关联起来,那么怎么做关联呢?
在app文件夹下的__init__.py中:
首先把db对象导入,
再使用db.init_app(app)做关联,init_app这个方法很重要,后边所有的Flask插件都使用这个方法做关联。
接着,
需要把数据库的配置信息放到配置文件中,因为数据库配置信息是属于比较机密的,所以我们放在secure.py中。
SQLALCHEMY_DATABASE_URI ='mysql+cymysql://root:123456@127.0.0.1:3306/demo'
上边配置信息的变量名SQLALCHEMY_DATABASE_URI这个是不可以更改的,必须使用这个,
后边参数的意思是使用cymysql这个驱动来做数据库操作,用户名root 密码 123456,ip 端口是127.0.0.1 3306,数据库名为demo。
cymysql需要安装:pip install cymysql
运行代码查看结果,数据库确实多了一张名为book的表。
ORM 对象关系映射 : 包含的层面更广阔 不仅仅是创建 还包含查询 更新 删除
与
Code First : 解决的是数据表创建的问题,专注业务模型设计而不是数据库设计,数据库只是存数据的,表关系应该有业务来决定
业务逻辑最好写在MVC中M中
应用上下文(AppContext)
请求上下文(RequestContext)
上下文本质来说其实就是对象
应用上下文:对核心对象Flask的封装
请求上下文:对请求对象Request的封装
为什么会需要上下文?直接操作Flask核心对象不行吗?
其实这个就是一个设计思想的问题,有时候对于一个对象来说,有一些信息是属于这个对象外部的,并不是属于对象本身,那么此时我们可以设计一个所谓的上下文(上下文就是一个对象),把Flask核心对象和外部的这些数据一起组成一个整体,这个整体就是我们说的上下文对象。
Flask核心对象:承载着各种各样的功能,例如:保存配置文件信息、提供注册路由\视图函数等这样的功能。
AppContext :把Flask核心对象做了一系列封装,并且附加了一些额外的参数
Request :保存了一些请求信息,例如: URL参数,完整的URL等等一切的请求信息都在这个对象中。
RequestContext : 对Request对象的封装。
在我们编码过程中,真正想去使用的是Flask核心对象或者是Request这个对象,但是我们要使用它并不一定要直接直接导入这俩核心对象,正确的做法是:
从AppContext或RequestContext间接的去拿Flask核心对象或者是Request。
Flask中,采用了LocalProxy模式(本地代理)的模式提供了间接去操作上下文的能力,也就是current_app和request这两个对象。
这里Flask使用了设计模式里边的代理模式。
网友评论