flask蓝图

蓝图

我们写的url和视图函数都是处于同一个文件,如果项目较大的话,这显然不是一个合理的结构,而蓝图可以优雅的帮我们实现这种需求。
基本使用:

from flask import Flask
from blueprints.news import news_bp
from blueprints.book import book_bp

app = Flask(__name__)
# 注册进来
app.register_blueprint(news_bp)
app.register_blueprint(book_bp)


@app.route("/")
def index():
    return "这是首页啊"

if __name__ == '__main__':
    app.run(debug=True)

构建两个py文件,于首页相呼应!然后我们在主程序中,通过app.register_blueprint()方法将这个蓝图注册进url映射中,看下主app的实现。
以后访问/user//user/profile/,都是执行的user.py文件中的视图函数,这样就实现了项目的模块化。

from flask import Blueprint

news_bp = Blueprint('news', __name__)

@news_bp.route('/news/')
def news():
    return "新闻首页"
from flask import Blueprint

book_bp = Blueprint('book', __name__)

@book_bp.route('/book/')
def book():
    return "图书首页"

@book_bp.route('/book/detail/<bid>')
def book_detail(bid):
    return "图书的ID %s" % bid

蓝图中url_prefix=的使用:

from flask import Blueprint

book_bp = Blueprint('book', __name__, url_prefix="/book")

@book_bp.route('/')
def book():
    return "图书首页"

@book_bp.route('/detail/<bid>')
def book_detail(bid):
    return "图书的ID %s" % bid
# url_prefix 路由是从news/开始的
news_bp = Blueprint('news', __name__, url_prefix="/news")

# 路由地址就直接传入/就可以了
@news_bp.route('/')
def news():
    return "新闻首页"

蓝图还需要去寻找静态文件、模板文件、url_for函数如何反转url

静态文件

默认不设置任何静态文件路径, Jinja2会在项目的static文件夹中寻找静态文件。也可以设置其他的路径,在初始化蓝图的时候,blueprint这个构造函数,有一个参数static_folder可以指定静态文件的路径。

bp = Blueprint('admin', __name__,url_prefix='/admin', static_folder='static')

static_folder可以是相对路径(相对于蓝图文件所在的目录),也可以是绝对路径。在配置完蓝图后,还有一个需要注意的地方是如何在模板中引用静态文件。在模板中引用蓝图,应该要使用蓝图名+, +static来引用。

<link href="{{ url_for('admin.static',filename='about.css') }}>

跟静态文件一样,默认不设置任何的模板文件的路径,将会在项目的templates中寻找模板文件。也可以设置其他的路径,在构造函数Blueprint中有一个template_folder参数可以设置模板的路径。

bp = Blueprint('admin', __name__,url_prefix='/admin'.template_folder = 'templates')

模板文件和静态文件有点区别,以上代码写完以后,如果你渲染一个模板return render_template('admin.html'),Flask默认会去项目根目录下的templates文件夹中查找admin.html文件,如果找到了就直接返回,如果没有找到,才回去蓝图文件所在的目录下的templates文件夹中寻找。

url_for生成url

用url_for生成蓝图的url,使用的格式是:蓝图名称.视图函数名称。比如要获取admin这个蓝图下的index视图函数的url

url_for('admin.index')

这个蓝图名称是在创建蓝图的时候,传入的第一个参数。

bp = Blueprint(;admin', __name__,url_prefix='/admin', template_folder = 'templates')
@book_bp.route('/')
def book():
    print(url_for("book.book_detail", bid=3))
    return "图书首页"

导入文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
<!--    <link rel="stylesheet" href="{{ url_for('static', filename='news.css') }}">-->
        <link rel="stylesheet" href="{{ url_for('news.static', filename='news.css') }}">

</head>
<body>
    <h1>这是template中的新闻首页</h1>
</body>
</html>

第二种导入要配合py文件的static_folder=""

from flask import Blueprint, render_template

# url_prefix 路由是从news/开始的
# template_folder= "" 是相对路径,与该文件处在同一文件夹下,若外面
# 没有templates文件夹,或没有导入的html文件,则会在这个文件夹下寻找。
news_bp = Blueprint('news', __name__, url_prefix="/news", static_folder='static')

# 路由地址就直接传入/就可以了
@news_bp.route('/')
def news():
    # return "新闻首页"
    return render_template('news.html')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值