flask项目结构参考与g对象

发布时间 2023-04-04 15:54:15作者: leethon

flask项目结构参考与g对象

flask本身是一个轻量化的框架,如果选择flask做项目,大部分时候,可能并不是打算运行特别庞大的项目,因此flask项目的结构并没有特别统一的规范,这篇文章仅作参考。

flask蓝图

蓝图——blueprint

蓝图的基本使用

from flask import Flask, Blueprint

app = Flask(__name__)

order_bp = Blueprint('order', __name__)


@order_bp.route('/')
def index1():
    return 'ooo'


app.register_blueprint(order_bp)

上述代码中,蓝图的注册方式与使用方法和app类似,最终再将这个蓝图注册到app中,app这个flask对象就也可以访问到蓝图所注册的路由了。

那么我们为什么要使用蓝图呢?

是为了分模块所准备的,我们可以导入app使用app注册路由等操作,但是如果有很多文件要导入app最终app又需要在某一个文件下run起来,这个问题就变的棘手了,很有可能导致循环导入问题。

所以我们在需要使用app功能的文件下先注册蓝图,让蓝图代app执行它的功能,最终再将蓝图注册到app中,让app统一启动即可。

多py文件flask项目

##### app_start.py
from flask import Flask
from order import order_bp
from home import home_bp

app = Flask(__name__)
app.register_blueprint(order_bp)

if __name__ == '__main__':
    app.run()
    
##### order.py
from flask import Blueprint

order_bp = Blueprint('order', __name__,url_prefix='order')  # 可以使用url_prefix加此蓝图注册的路由前缀

@order_bp.before_request
def before():
    print('请求来了')

@order_bp.route('/')
def index1():
    return 'order'

##### home.py
from flask import Blueprint

home_bp = Blueprint('home', __name__,url_prefix='home')

@home_bp.route('/')
def index():
    return 'home'

上述代码分为了三个py文件,在编写其中一个py文件时,不需要考虑其他py文件的执行顺序。

两个蓝图文件中,只需要注册一个蓝图对象,然后当做app使用即可

总启动文件则需要将其他文件中的蓝图对象导入并注册蓝图,然后app中就包囊了这些蓝图所有的功能,此时app.run()即可启动flask项目。

flask项目目录参考

flask小项目

涉及前后端混合的项目可能会需要templates和static目录

-项目文件夹
    -src							 # 核心代码
    	-(static)						# 静态文件
        -(templates)				# 模板文件
        __init__.py					   # src包
            ↑产生flask的app,并注册蓝图
        -views							# 视图文件夹
        	v1.py						 # 视图文件1
        	v2.py						 # 视图文件2        
        models.py					 # 表模型
    manage.py						# 启动文件
    	↑导入src中的app,run

flask稍微大一点的项目

-项目文件夹
    -src    							 # 核心代码
    	__init__.py					   # src包
        	↑产生flask的app,并注册蓝图
    	-app1							# 每个app有自己的表模型、视图、静态文件等
            __init__.py					   # src包
                ↑产生app1的蓝图,并注册子蓝图
            -(static)						# 静态文件
            -(templates)				# 模板文件
            -views							# 视图文件夹
                v1.py						 # 视图文件1
                v2.py						 # 视图文件2        
            models.py					 # 表模型
            befores.py					  # 请求来时的函数可以统一在这
            afters.py						# 响应走时
        -app2
        -app。。
    manage.py						# 启动文件
    	↑导入src中的app,run

子蓝图

上文中提到蓝图拥有flask几乎所有的方法,实际上它也有注册蓝图的方法,所以我们可以让一个蓝图A去注册另一个蓝图B,这样就可以称蓝图B是蓝图A的子蓝图。

这里的子蓝图是笔者自己起的名字,只是方便理解项目层级中的蓝图关系。我们可以在视图中先产生视图子蓝图,最终再app1的__init__中将其归总到app1蓝图中,所有的app级别蓝图最终又归总到src的flask对象app中。

g对象

g对象的作用

g对象实际为global的意思,它表示本次请求的全局变量,注意与直接在文件的顶格书写的全局变量相比,它的全局范围更小只作用于每次请求,而顶格书写所定义的全局变量是项目一启动就在本文件的全局共享的。

g对象可以作为上下文管理的变量, 如我在befores中请求处理函数中产生了一个xx值,存入了g的g.xx中,那么在views视图函数中我就可以用g.xx的值拿到xx值。而这两个函数甚至是不同的py文件中执行的。

g对象与request对象一样都可以全局直接导入使用表示本次请求可用的变量,那为什么不直接使用request对象呢?因为g是纯净的空对象,与request区分可以避免污染request的变量。

g对象和session对象有何不同?g对象只有本次请求有效,session对象是多次请求都有效(将内容存到了cookie中,下次携带过来处理成session已达到多次请求的变量延续)

g的基本使用

from flask import Flask, g, request

app = Flask(__name__)
app.debug = True

@app.before_request
def before():
    g.xx = 'xx'   # 存值

@app.route('/')
def index():
    print(g.xx)  # 查值
    return '..'