访问点/endpoint
我们一直强调,路由的作用是根据请求的URL,找到对应的视图函数。这没错,但是在 Flask框架中,请求任务的分发并不是直接从用户请求的URL一步定位到视图函数, 两者之间隔着一个访问点/endpoint。
在Flask内部使用两张表维护路由:
url_map:维护URL规则和endpoint的映射
view_functions:维护endpoint和视图函数的映射。
###############################
MVC
MVC(Model View Controller 模型-视图-控制器)是一种Web架构的模式。
特点:把业务逻辑、模型数据、用户界面分离开来,让开发者将数据与表现解耦。
MVC三要素:
Model(数据模型)。是对客观事物的抽象。
比如知乎Live,Live就是一个模型,可以用Live类来表示。而一个模型通常还带有很多的和业务相关的逻辑,比如添加,更新,获取Live主讲人信息等等,这些组成了模型的方法。对于开发者模型的表示方法非常易懂和清晰,可以通过非常便捷的代码来做CURD操作而无需写一条又一条的SQL语句。
View(视图)。呈现给用户的效果,呈现的内容是基于Model,它也是收集用户输入的地方。
MTV
和Rails、Spring、Laravel等其他语言的Web框架不一样,在Python的世界中,基本(除了Pylons)都使用了MVC的变种MTV(Model Templates View 模型-模板-视图):
Model(数据模型)。和MVC的Model一样,处理与数据相关的所有事务:如何存取、如何确认有效性、包含哪些行为以及数据之间的关系等。
Template(模板)。处理与表现相关的决定:如何在页面或其他类型文档中进行显示出来。
View。处理业务逻辑,视图就是一个特定URL的回调函数,回调函数中描述数据:从Model取出对应的数据,调用相关的模板。它就是Contorller要调用的那个用来做Model和View之间的沟通函数,从而完成控制。
注意:MVC中的View的目的是「呈现哪一个数据」,而MTV的View的目的是「数据如何呈现」。
也就是把MVC中的View分成了视图(展现哪些数据)和模板(如何展现)2个部分,而Contorller这个要素由框架自己来实现了,我们需要做的就是把(带正则表达式的)URL对应到视图就可以了,通过这样的URL配置,系统将一个请求发送到一个合适的视图。
需要注意,Flask这种微框架就不是一个MVC模式的,因为它没有提供Model,除非集成了SQLAlchemy之类的ORM进来。