Flask 項目中使用 bootstrap

flask 的插件中有一個 flask-bootstrap 項目, 但是用起來不怎么方便, 如果大家感興趣的話, 還是直接在項目中引入 bootstrap.

flask 項目的目錄結(jié)構

項目名稱/
    app/
        static/ # 靜態(tài)文件夾
            css/ # 項目中引入的 css 樣式表
            js/ # 項目中引入的 js
            fonts/ # 項目中需要的字體,一般是 bootstrap 所依賴的字體
            images/ # 項目中的圖片文件夾
        templates/ # html 模板文件夾
            common/ # 通用打模板文件
            ...
        views.py
        __init__.py
    env/ # python 虛擬環(huán)境
    run.py # 啟動文件

引入 bootstrap

下載 bootstrap

將 bootstrap 的 dist 文件夾下的 css,js恳邀,fonts 三個文件夾拷貝到項目的 static 文件夾下.在以后的學習過程中,你會發(fā)現(xiàn),其實不需要完全拷貝的,你可以精簡一些無用的文件
當然超升,由于 bootstrap 是基于 jquery 的,所以從網(wǎng)上下載 jquery.js 并拷貝至 js 文件夾下.具體下載的步驟哺徊,不再贅述.

制作基礎模板

在 templates/common 文件夾下建立一個 base.html 文件.內(nèi)容如下:

<!DOCTYPE html>
<html lang="zh-CN">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
        <meta name="description" content="藕絲空間">
        <meta name="author" content="東方鶚">
        <link rel="icon" href="{{ url_for('static', filename='images/favicon.ico') }}"><!--引入項目的圖標室琢,將需要的 ico 文件放到 static/images 文件夾下.-->

        <title>{% block title %}我的第一個前端頁面{% endblock %}</title>
        <!--設置網(wǎng)頁的標題,通過這樣的設置唉工,你可以利用 jinja2 的一些特性研乒,將每個網(wǎng)頁的標題進行不通的設置.-->

        {% block css %} <!--css模塊區(qū)域-->
        <!-- Bootstrap core CSS -->
        <link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap.min.css') }}">
        <!-- 可選的Bootstrap主題文件(一般不用引入) -->
        <link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap-theme.min.css') }}">
        <!-- Custom styles for this template -->
        <link href="{{ url_for('static', filename='css/offcanvas.css') }}" rel="stylesheet">
        {% endblock %}
    </head>

    <body>
        {% include "common/header.html" %}<!--引入網(wǎng)頁的頭部模板-->
        <div class="container">
            <div class="row row-offcanvas row-offcanvas-right">
                {% block content %}<!--自定義模板區(qū)域-->

                {% endblock %}
                {% include "common/sidebar.html" %}<!--引入網(wǎng)頁的側(cè)邊模板-->
            </div><!--/row-->
            {% include "common/footer.html" %}<!--引入網(wǎng)頁的底部模板-->
        </div>

        {% block js %}<!--js模塊區(qū)域-->
        <!-- Bootstrap core JavaScript
        ================================================== -->
        <!-- Placed at the end of the document so the pages load faster -->
        <script src="{{ url_for('static', filename='js/jquery.js') }}"></script>
        <script src="{{ url_for('static', filename='js/bootstrap.min.js') }}"></script>
        <script src="{{ url_for('static', filename='js/offcanvas.js') }}"></script>
        {% endblock %}
    </body>
</html>

此模板是基于 bootstrap 的項目實例- offcanvas 制作的,你可以在 bootstrap 的源碼中找到該實例.

具體的解釋請看代碼的注釋部分.此時淋硝,你的基礎模板上是有錯誤存在的.因為還沒有制作頭部雹熬,底部和側(cè)邊模板.

制作頭部模板

頭部模板被放置在 templates/common 文件夾下,命名為 header.html.

<nav class="navbar navbar-fixed-top navbar-inverse">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="#">Project name</a>
        </div>
        <div id="navbar" class="collapse navbar-collapse">
            <ul class="nav navbar-nav">
                <li class="active"><a href="#">Home</a></li>
                <li><a href="#about">About</a></li>
                <li class="dropdown">
                  <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
                  <ul class="dropdown-menu">
                    <li><a href="#">Action</a></li>
                    <li><a href="#">Another action</a></li>
                    <li><a href="#">Something else here</a></li>
                    <li role="separator" class="divider"></li>
                    <li><a href="#">Separated link</a></li>
                    <li role="separator" class="divider"></li>
                    <li><a href="#">One more separated link</a></li>
                  </ul>
                </li>
            </ul>
        </div><!-- /.nav-collapse -->
    </div><!-- /.container -->
</nav><!-- /.navbar -->

制作底部模板

底部模板被放置在 templates/common 文件夾下谣膳,命名為 footer.html.

<hr>

<footer>
    <p>&copy; 2016 Company, Inc.</p>
</footer>

制作側(cè)邊模板

側(cè)邊模板被放置在 templates/common 文件夾下竿报,命名為 sidebar.html.

<div class="col-xs-6 col-sm-3 sidebar-offcanvas" id="sidebar">
    <div class="list-group">
        <a href="#" class="list-group-item active">
            <button type="button" class="btn btn-block btn-danger" aria-label="Left Align">
                <span class="glyphicon glyphicon-align-left" aria-hidden="true"></span>
            </button>
        </a>
        <a href="#" class="list-group-item">
            <button type="button" class="btn btn-block btn-info" aria-label="Left Align">
                <span class="glyphicon glyphicon-align-center" aria-hidden="true"></span>
            </button>
        </a>
        <a href="#" class="list-group-item">
            <button type="button" class="btn btn-primary" aria-label="Left Align">
                <span class="glyphicon glyphicon-align-right" aria-hidden="true"></span>
            </button>
        </a>
        <a href="#" class="list-group-item">
            <button type="button" class="btn btn-success" aria-label="Left Align">
                <span class="glyphicon glyphicon-align-justify" aria-hidden="true"></span>
            </button>
        </a>
        <a href="#" class="list-group-item">
            <button type="button" class="btn btn-block btn-warning" aria-label="Left Align">
                <span class="glyphicon glyphicon-align-left" aria-hidden="true"></span>
            </button>
        </a>
        <a href="#" class="list-group-item">Link</a>
        <a href="#" class="list-group-item">Link</a>
        <a href="#" class="list-group-item">Link</a>
        <a href="#" class="list-group-item">Link</a>
        <a href="#" class="list-group-item">Link</a>
    </div>
</div><!--/.sidebar-offcanvas-->

制作項目的主頁

現(xiàn)在需要在項目的主頁中引入基礎模板,然后自定義自己的部分模板即可.index.html 在 templats 文件夾下继谚,和頭部烈菌,底部和側(cè)邊模板不在一個目錄下,而在上級目錄里.

{% extends "common/base.html" %}<!--繼承基礎模板-->
{% block content %}<!--自定義模板區(qū)域-->
<div class="col-xs-12 col-sm-9">
  <p class="pull-right visible-xs">
    <button type="button" class="btn btn-primary btn-xs" data-toggle="offcanvas">Toggle nav</button>
  </p>
  <div class="jumbotron">
    <h1>Hello, world!</h1>
    <p>This is an example to show the potential of an offcanvas layout pattern in Bootstrap. Try some responsive-range viewport sizes to see it in action.</p>
  </div>
  <div class="row">
    <div class="col-xs-6 col-lg-4">
      <h2>Heading</h2>
      <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
      <p><a class="btn btn-default" href="#" role="button">View details &raquo;</a></p>
    </div><!--/.col-xs-6.col-lg-4-->
    <div class="col-xs-6 col-lg-4">
      <h2>Heading</h2>
      <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
      <p><a class="btn btn-default" href="#" role="button">View details &raquo;</a></p>
    </div><!--/.col-xs-6.col-lg-4-->
    <div class="col-xs-6 col-lg-4">
      <h2>Heading</h2>
      <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
      <p><a class="btn btn-default" href="#" role="button">View details &raquo;</a></p>
    </div><!--/.col-xs-6.col-lg-4-->
    <div class="col-xs-6 col-lg-4">
      <h2>Heading</h2>
      <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
      <p><a class="btn btn-default" href="#" role="button">View details &raquo;</a></p>
    </div><!--/.col-xs-6.col-lg-4-->
    <div class="col-xs-6 col-lg-4">
      <h2>Heading</h2>
      <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
      <p><a class="btn btn-default" href="#" role="button">View details &raquo;</a></p>
    </div><!--/.col-xs-6.col-lg-4-->
    <div class="col-xs-6 col-lg-4">
      <h2>Heading</h2>
      <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
      <p><a class="btn btn-default" href="#" role="button">View details &raquo;</a></p>
    </div><!--/.col-xs-6.col-lg-4-->
  </div><!--/row-->
</div><!--/.col-xs-12.col-sm-9-->
{% endblock %}

到此花履,模板部分已經(jīng)設置完畢.為了能夠看到和測試我們的勞動成果芽世,我們需要把 flask 項目寫完整.

完善項目并展示

__init__.py 代碼

from flask import Flask

app = Flask(__name__)

from app import views

views.py 代碼


from app import app
from flask import render_template


@app.route('/', methods=['GET', 'POST'])
def index():

    return render_template('index.html')

run.py


from app import app

app.run(debug=True)

至此,項目已經(jīng)能夠展示了.

展示

全屏展示
手機展示

點擊導航展示

進階

在模板中使用 jinja2 自定義的過濾器

首先自定義一個函數(shù)

def jfloat(s):
    return float(s)

本函數(shù)是為了在模板中將字符串诡壁,整型等其它類型轉(zhuǎn)換為浮點型.

為了能夠在 jinja2 模板中使用該函數(shù).需要在項目的根 __init__.py 文件里的工廠函數(shù) create_app() 中寫入如下代碼:

...

def create_app(config_name):
    ...
    app.jinja_env.filters['jfloat'] = jfloat

這樣济瓢,你就可以在模板中使用該過濾器啦.

參考

http://docs.jinkan.org/docs/jinja2/api.html#writing-filters
http://www.tuicool.com/articles/7v6Ffiq

不同的藍圖中使用模板注意事項

http://www.os373.cn/article/58

查看原文

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市妹卿,隨后出現(xiàn)的幾起案子旺矾,更是在濱河造成了極大的恐慌,老刑警劉巖夺克,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件箕宙,死亡現(xiàn)場離奇詭異,居然都是意外死亡铺纽,警方通過查閱死者的電腦和手機柬帕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狡门,“玉大人陷寝,你說我怎么就攤上這事∪谧玻” “怎么了盼铁?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長尝偎。 經(jīng)常有香客問我饶火,道長,這世上最難降的妖魔是什么致扯? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任肤寝,我火速辦了婚禮,結(jié)果婚禮上抖僵,老公的妹妹穿的比我還像新娘鲤看。我一直安慰自己,他們只是感情好耍群,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布义桂。 她就那樣靜靜地躺著找筝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪慷吊。 梳的紋絲不亂的頭發(fā)上袖裕,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音溉瓶,去河邊找鬼急鳄。 笑死,一個胖子當著我的面吹牛堰酿,可吹牛的內(nèi)容都是我干的疾宏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼触创,長吁一口氣:“原來是場噩夢啊……” “哼坎藐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嗅榕,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤顺饮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后凌那,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兼雄,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年帽蝶,在試婚紗的時候發(fā)現(xiàn)自己被綠了赦肋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡励稳,死狀恐怖佃乘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情驹尼,我是刑警寧澤趣避,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站新翎,受9級特大地震影響程帕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜地啰,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一愁拭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧亏吝,春花似錦岭埠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽许赃。三九已至,卻和暖如春来涨,著一層夾襖步出監(jiān)牢的瞬間图焰,已是汗流浹背启盛。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工蹦掐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人僵闯。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓卧抗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鳖粟。 傳聞我的和親對象是個殘疾皇子社裆,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容