Flask:蓝图
1 蓝图
对程序进行目录结构划分,没有蓝图之前Flask是单文件,或者自己拆分成多个文件,进行分层
1.1 不使用蓝图,自己划分文件(不推荐,容易出现循环导入问题)
目录结构
run.py
from views import app
if __name__ == '__main__':
app.run()
init.py
from flask import Flask
app = Flask(__name__)
from . import order
from . import user
user.py
from . import app
@app.route('/user')
def user():
return 'user'
order.py
from . import app
@app.route('/order')
def order():
return 'order'
1.2 蓝图的基本使用
目录结构:跟自己划分目录一样,只不过用蓝图对象替代了app对象,避免了循环导入问题,类似于app注册路由时分发到不同的蓝图对象
run.py
from views import app
if __name__ == '__main__':
app.run()
init.py
from flask import Flask
app = Flask(__name__)
from . import order
from . import user
# 第一步:在app中注册蓝图,括号里是一个蓝图对象
# 第二步:在不同文件中注册路由时,使用蓝图对象注册,不再使用app对象注册,避免了循环导入问题
app.register_blueprint(user.us)
app.register_blueprint(order.ord)
user.py
from flask import Blueprint
us = Blueprint('user', __name__) # 生成蓝图对象,传入name 和 import_name
@us.route('/user') # 注册路由使用蓝图对象替代app对象
def user():
return 'user'
order.py
from flask import Blueprint
ord = Blueprint('order', __name__)
@ord.route('/order')
def order():
return 'order'
使用蓝图时需要注意的
1.3 使用蓝图之中小型系统
目录结构
run.py
from mid_flask import app # 导入mid_flask包下的__init__中的app
if __name__ == '__main__':
app.run()
init.py
from flask import Flask
# 配置template和静态文件路径,并且开放静态文件访问路径
app = Flask(__name__, template_folder='templates', static_folder='statics', static_url_path='/static')
from .views.account import account
from .views.blog import blog
from .views.user import user
app.register_blueprint(account)
app.register_blueprint(blog)
app.register_blueprint(user)
account.py(在各个模块中用蓝图对象注册路由,写视图函数)
from flask import Blueprint, request, render_template
account = Blueprint('account', __name__)
# /login.html用的伪静态路径
@account.route('/login.html', methods=['GET', 'POST'])
def login():
return render_template('login.html')
1.4 使用蓝图之大型系统
目录结构:把app拆分开(多app项目),各自用各自的静态文件和模板文件
run.py
from pro_flask import app
if __name__ == '__main__':
app.run()
init.py
from flask import Flask
from .admin import admin
from .web import web
app = Flask(__name__)
app.debug = True
app.register_blueprint(admin, url_prefix='/admin') # admin这个蓝图对象的url加了前缀,访问http://127.0.0.1:5000/admin/...
app.register_blueprint(web)
# admin和web蓝图对象写在app包下的__init__文件中
inti.py(admin应用下的init文件)
from flask import Blueprint
# 在admin蓝图里,指定它的静态路径和模板文件路径
admin = Blueprint('admin', __name__, template_folder='templates', static_folder='static')
# 导入视图文件,总的__init__在引入时才能找到视图函数
from . import views
views.py(admin应用下的view)
from . import admin # 导入当前app的蓝图
@admin.route('/index')
def index():
return 'Admin Index'