穆琪的博客

一个程序员的自传

flask模块化组件和蓝图实例

一、创建一个python包app,修改其中的__init__.py:

from flask import Flask
import sys
reload(sys)
sys.setdefaultencoding('utf8')
app = Flask(__name__)
二、将根目录下的的    项目名.py    修改:
from app import app
from app.dept import dept
from app.user import user
import sys
reload(sys)
sys.setdefaultencoding('utf8')
app.register_blueprint(user, url_prefix='/user')#此行及下面都是将模块导入进来
app.register_blueprint(dept, url_prefix='/dept')
if __name__=='__main__':
    app.run()
三、创建模块相应的python包:创建templates目录(在每个模块下都创建,并且在下面创建一个目录,用来区分其他模块中的同名模板)创建一个路由文件,views 修改__init__.py文件:
# coding:utf-8
from flask import Blueprint
user = Blueprint("user", __name__, template_folder="templates", static_folder="static")
from app.user import views
上面文件中的值请自行替换成模块的名字 此时,在根目录下面的项目名.py中导入这个对象,然后注册,就可以以模块化方式使用flask 四、项目结构
蓝图资源 这里需要注意的是,我在admin中把html模板放在了 templates/admin/index.html 这样的目录下,这样是为了区分蓝图home和admin的模板,官方的建议是按照 admin/templates/admin/***.html 这样的方式存放模板(官方文档)如果admin的模板路径和home的模板路径一样都为  templates/***.html这样的格式的话,在我调用http://127.0.0.1:5000/admin/显示的是蓝图admin下templates中的index.html没有错,但是如果后面我调用http://127.0.0.1:5000/home/所显示出来的index.html页面还是admin中的index.html页面,问题就展示出来了,如果有两个蓝图或多个蓝图,它们的模板目录都为  ***/templates/***.html这样的结构,如果在它们的templates下有着同名html文件,那么后面的蓝图加载的同名html文件会是第一个蓝图中的html 蓝图构建URL使用url_for(),第一个参数我们称为端点,例如我们在该项目中创建的蓝图名 "admin",创建Blueprint对象时的第一个参数 所以我们通过端点名称来获取URL时,我们可以这样写: form flask import url_for url_for("admin.index") # return /admin/ url_for("admin.static",filename="style.css") # return /admin/static/style.css 这样才能获得"admin"蓝图下视图或资源的URL地址,如果"url_for()"函数的调用就在本蓝图下, 那么蓝图名就可以省略,但是必须留下"."表示当前蓝图: url_for(".index") url_for(".static",filename="style.css")例如admin下的测试HTML index中的js由下列代码所示加载
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--这里给蓝图加载js,前加上admin-->
    <script type="text/javascript" src="{{ url_for("admin.static",filename="js/jquery-1.8.3.min.js") }}"></script>
</head>
<body>
<h1>这是一个测试{{ data }},来自admin</h1>
</body>
</html>
当然也可以使用相对路径的方式加载: ../pro/admin/static/js/jquery-1.8.3.min.js 如果项目不大的话可以不使用的蓝图的方式,一开始接触的时候,看到别人的文件目录都是把templates文件夹放到和运行文件不同级的目录下,最开始我也按照那种方式创建文件目录,当时我并没有注册蓝图,所以在app.py中的视图函数一直找不到templates下的html文件,直到创建蓝图后才发现,app.py中视图函数没有找到html的话,会到蓝图下的templates中去找同名的html文件,例如我的app.py中
from flask import Flask, render_template
from pro.admin.admin_module import admin
from pro.home.home_module import home_db
 
app = Flask(__name__, template_folder="template")
 
app.register_blueprint(admin, url_prefix="/admin")   # url_prefix="/admin" 指定蓝图的URL前缀
app.register_blueprint(home_db)     # 这里没有指定URL前缀是因为在创建蓝图时就设置好了
 
 
@app.route('/<name>')
def hello_world(name):
    return render_template("app.html", data=name)
上面代码中,我建立Flask对象时,指定的template_folder="template" ,如下图所示,所以app.py中的视图函数会到同级目录中的template中去找对应的html, 如果没有指定template_folder,且没有在同级目录中创建templates文件夹,那么app.py的视图函数会到蓝图下的templates中去找相同名字的html

© 鲁ICP备18041558号
Powered by Z-BlogPHP & Yiwuku.com