zl程序教程

您现在的位置是:首页 >  其他

当前栏目

用 Flask 来写个轻博客 (17) — MV(C)_应用蓝图来重构项目

博客应用项目重构 17 Flask MV 蓝图
2023-09-27 14:28:47 时间
用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 Flask 来写个轻博客 (3) — (M)...

创建存放整个模块的文件夹 jmilkfansblog
NOTE: 一般来说这个文件夹的名字应该跟项目的名字一模一样

将文件 config.py/models.py 和目录 static/template move 到 jmilkfansblog 目录下

将文件 main.py move 到 jmilkfansblog 目录下并重命名为 __init__.py,将 wt_forms.py move 到 jmilkfansblog 目录下并重命名为 forms.py

创建 jmilkfansblog/controllers 目录,并创建控制器 jmilkfansblog/controllers/blog.py

将 views.py move 成为 jmilkfansblog/controllers/blog.py

现在整个目录结构应该是这样的:


NOET :在现在的目录结构中,存在这大量的 __init__.py 文件,这是当在一个目录结构中存在该文件的话,Python 就会将会该目录解析成为一个包。


首先要将所有 move 到 blog 中的模板文件中的 url_for() 函数中的参数修改为 url_for(blog.XXX) 或 url_for(.XXX)(当视图函数XXX是属于该模板目录所对应的蓝图时才能使用)。这是因为使用蓝图之后可能会出现多个同名的视图函数,所以 url_for() 函数中的参数必须是 ‘绝对路径’ 才能够正确的返回视图函数所对应的 URL。EG url_for(blog.home, page=3) 所返回的 URL 为 http://127.0.0.1:8089/blog/3 中的 /blog/3 ,而不是 /3
NOTE : 在 blog.py 中的视图函数 home() 的路由装饰器为 @blog_blueprint.route(/),而不是 @blog_blueprint.route(/blog/),这是因为创建蓝图对象 blog_blueprint 时,传入 url_prefix 的实参为 ‘/blog’,所以所有装饰器 @blog_blueprint.route 的路由 URL 定义会被自动的加入 ‘/blog’ 前缀。这样也便于我们编写同一个蓝图下视图函数的路由代码。

将所有的 SQLAlchemy 代码都迁移到 models 模块中,其中包括了 import SQLAlchemy 的相关语句、Model class、tables object 等。

models.py
posts_tags = db.Table(posts_tags, db.Column(post_id, db.String(45), db.ForeignKey(posts.id)), db.Column(tag_id, db.String(45), db.ForeignKey(tags.id)))

NOTE : 数据库对象 db 的初始化不能再在 models 模块中进行,因为如果在该模块中导入 app 对象,很可能会造成将所有的的情况,所以我们将初始化 db 对象的代码实现在了 jmilkfansblog/__init__.py 中。


将所有的 WTForm 代码都迁移到 forms 模块中,其中包括了 所有的 Form class、Validation function 等。直接将 wt_forms.py 重命名为 forms.py 就可以了

将 jmilkfansblog/controllers/blog.py 定义成为一个表示博客展示页功能(表现层)组件的 Flask Blueprint,需要把 views 模块中所有的 路由函数、视图函数、sidebar_data() 等都迁移到 blog 模块中,实际上我们可以 mv views.py jmilkfansblog/controllers/blog.py 然后再做修改:

blog.py
from jmilkfansblog.models import db, User, Post, Tag, Comment, posts_tags from jmilkfansblog.forms import CommentForm

NOTE:现在当我们需要为这个 blog Application 添加一个新的蓝图时,我们只需要在 jmilkfansblog/controllers/ 目录下新建一个模块文件就可以实现。


再一个,我们需要多 jmilkfansblog/init.py 文件进行重构,该文件应该包含了 app 对象的创建、index()、注册蓝图 等代码。当然我们还要将初始化数据库对象 db

jmilkfansblog/__init__.py

最后需要修改 manage.py 中的导入语句

from flask import Flask, redirect, url_for

from config import DevConfig

from models import db

from controllers import blog

app = Flask(__name__)

# Get the config from object of DecConfig

app.config.from_object(DevConfig)

# Will be load the SQLALCHEMY_DATABASE_URL from config.py to db object

db.init_app(app)

@app.route(/)

def index():

 # Redirect the Request_url / to /blog/

 return redirect(url_for(blog.home))

# Register the Blueprint into app object

app.register_blueprint(blog.blog_blueprint)

if __name__ == __main__:

 app.run()

NOTE:以往我们还需要在 main.py 中导入视图模块 views 才能够使这些视图函数生效,现在因为我们将蓝图对象注册到了 app 对象中,而且 index() 路由函数还重定向到了 blog/home() 中 。所以现在我们并不需要将 blog 模块导入到 jmilkfansblog/__init__.py 也能使这些视图函数生效了。


/blog/
:被 jmilkfansblog.controllers.blog.home() 获取,然后渲染并返回 jmilkfansblog/templates/blog/home.html

controllers 目录的意义:在 controllers/ 目录下,我们定义的 blog.py 蓝图模块(因为含有蓝图对象,并将视图函数注册到了该蓝图对象中),本质上就是以往的视图模块,主要还是用于控制 HTTP 请求的 URL 路由跳转。在以后的开发过程中,如果需要定义一个新的蓝图,那么我们只需要在该目录下创建一个新的蓝图模块,并将蓝图模块中的蓝图对象注册到应用程序入口 jmilkfansblog/init.py 的 app 对象中就可以了。

将视图函数注册到蓝图中:能够让我们在定义视图函数的路由 URL 的时候更加方便,而且自成一套命名空间,使得 Python 代码更加简洁。但是需要注意的是,我们一般会为一个蓝图准备独立出一个存放其模板文件和静态文件的目录,所以在编写模板文件的时候,一定要注意在 url_for 中使用 全路径 的引用方式。

将蓝图注册到 app 中:蓝图是为了让整个项目更具模块化,引入了组件的思想,使得一个项目就像是由多个组件组合起来的一样。符合松耦合的设计思想,极大的提高了项目的扩展能力和便于合作开发。在这个项目中引入蓝图是为了以后添加后台管理组件、用户登陆组件等所做的准备。


Flask应用的基本结构·快速入门Flask 所有Flask应用都必须创建一个应用实例。Web服务器使用一种名为Web服务器网关接口(WSGI,Web server gateway interface,读作“wiz-ghee”)的协议,把接收自客户端的所有请求都转交给这个对象处理。应用实例是Flask类的对象,通常由下述代码创建:
docker 部署flask&matplotlib应用 Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。Flask是一个使用 Python 编写的轻量级 Web 应用框架。本文介绍通过Dockerfile生成镜像,对外部署通过API接口的方式调用绘图服务。
【flask高级】从源码深入理解flask的应用上下文和请求上下文 之前在flask入门系列中大概写了flask的应用上下文和请求上下文,比较浅显,但我们后面要了解flask的运行机制,就必须先深入了解一下flask中的应用上下文和请求上下文,这节阿牛将继续带你从源码来剖解他的奥秘!
Flask 教程 第十五章:优化应用结构 本文转载自:https://www.jianshu.com/p/c47b05ccc00e 这是Flask Mega-Tutorial系列的第十五部分,我将使用适用于大型应用的风格重构本应用。 Microblog已经是一个初具规模的应用了,所以我认为这是讨论Flask应用如何在持续增长中不会变得混乱和难以管理的好时机。