一個web應用的誕生(3)--美化一下

經(jīng)過上一章的內(nèi)容箭阶,其實就頁面層來說已結(jié)可以很輕松的實現(xiàn)功能了,但是很明顯美觀上還有很大的欠缺,現(xiàn)在有一些很好的前端css框架澜倦,如AmazeUI,騰訊的WeUI等等,這里推薦一個和flask集成很好的bootstrap框架

安裝框架

在模板中直接引用bootstrap的CDN或者本地路徑外杰妓,還可以直接應用flask的bootstrap集成包,首先需要對集成包進行安裝:

pip3.6 install flask-bootstrap

這是一個flask的擴展包藻治,flask的所有擴展包默認默認的包名都為flask.ext打頭,同樣bootstrap也是如此稚失,首先在default的文件的頭部導入包:

from flask.ext.bootstrap import Bootstrap

然后對bootstrap進行初始化栋艳,修改代碼:

bootstrap=Bootstrap(app)

初始化之后,就可以使用Jinja2的繼承方式使用此包中的包含的一系列的針對Bootstrap的基模板句各∥迹基模板中直接引用了一系列的bootstrap中的元素。

還記得如何在jinja2中使用模板繼承吧凿宾,下面在使用之前矾屯,首先看看基模板的結(jié)構(gòu):

{% block doc -%}
<!DOCTYPE html>
<html{% block html_attribs %}{% endblock html_attribs %}>
{%- block html %}
  <head>
    {%- block head %}
    <title>{% block title %}{{title|default}}{% endblock title %}</title>

    {%- block metas %}
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    {%- endblock metas %}

    {%- block styles %}
    <!-- Bootstrap -->
    <link href="{{bootstrap_find_resource('css/bootstrap.css', cdn='bootstrap')}}" rel="stylesheet">
    {%- endblock styles %}
    {%- endblock head %}
  </head>
  <body{% block body_attribs %}{% endblock body_attribs %}>
    {% block body -%}
    {% block navbar %}
    {%- endblock navbar %}
    {% block content -%}
    {%- endblock content %}

    {% block scripts %}
    <script src="{{bootstrap_find_resource('jquery.js', cdn='jquery')}}"></script>
    <script src="{{bootstrap_find_resource('js/bootstrap.js', cdn='bootstrap')}}"></script>
    {%- endblock scripts %}
    {%- endblock body %}
  </body>
{%- endblock html %}
</html>
{% endblock doc -%}

從源碼中可以看出,這個基模板定義了12個block初厚,分別對應了整個文檔(doc),html屬性(html_attribs),整個html(html),整個head部分(head),title部分(title),meta代碼部分(metas),css樣式(styles),body屬性(body_attribs),body部分(body),導航(navbar),
頁面內(nèi)容(content),js(scripts)

并且title件蚕,meta,css产禾,和js均有默認的內(nèi)容排作,所以使用的時候需要加入{{super()}}

好,根據(jù)這個基模板的結(jié)構(gòu)亚情,修改login.html中的代碼為:

{% extends "bootstrap/base.html"%}

{% block title%}牛博客 {% endblock %}<!--覆蓋title標簽-->

{% block navbar %}
<nav class="navbar navbar-inverse"><!-- 導航部分 -->
  導航
</nav>
{% endblock %}
{% block content %} <!--具體內(nèi)容-->
<div class="container">
   <div class="container">
        <form method="post">
          <div class="form-group">
            <label for="username">用戶名</label>
            <input type="text" class="form-control" id="username" placeholder="請輸入用戶名">
          </div>
          <div class="form-group">
            <label for="passworld">密碼</label>
            <input type="password" class="form-control" id="passworld" placeholder="請輸入密碼">
          </div>
          <button type="submit" class="btn btn-default">登錄</button>
        </form>
    </div>
</div>
{% endblock %}

運行程序妄痪,現(xiàn)在的顯示結(jié)果為:

比剛剛漂亮多了,這時生成的html代碼為:

<!DOCTYPE html>
<html>
  <head>
    <title>牛博客 </title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- Bootstrap -->
    <link  rel="stylesheet">
  </head>
  <body>
    <nav class="navbar navbar-inverse"><!-- 導航部分 -->
      導航
    </nav>
     <!--具體內(nèi)容-->
    <div class="container">
        <form method="post">
          <div class="form-group">
            <label for="username">用戶名</label>
            <input type="text" class="form-control" id="username" placeholder="請輸入用戶名">
          </div>
          <div class="form-group">
            <label for="passworld">密碼</label>
            <input type="password" class="form-control" id="passworld" placeholder="請輸入密碼">
          </div>
          <button type="submit" class="btn btn-default">登錄</button>
        </form>
    </div>
    <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
  </body>
</html>

注意這幾個cdn的地址楞件,這個地址有時候會被擋在墻外衫生,這時怎么辦呢?
修改的方式為在python的安裝目錄下找到Lib\site-packages\flask_bootstrap文件夾土浸,文件夾下有init.py文件罪针,打開后看到如下代碼:


進行修改,順便提一下黄伊,我比較常使用bootcdn這個cdn服務器

下面使用土法進行一下測試泪酱,輸入test和123后的結(jié)果為:

顯示的還是之前的測試登錄成功頁,這顯然是不對的,一般來說西篓,bbs或blog都是跳到登錄前的頁面或者首頁愈腾,現(xiàn)在為了方便起見,都跳轉(zhuǎn)到首頁岂津,同時虱黄,如果用戶名或密碼錯誤,也要在登錄頁進行提示吮成,修改default.py代碼如下:

from flask import session #導入session對象

@app.route("/login",methods=["POST"])
def loginPost():
    username=request.form.get("username","")
    password=request.form.get("password","")
    if username=="test" and password=="123" :
        session["user"]=username
        return render_template("/index.html",name=username,site_name='myblog')
    else:
        return "登錄失敗"

登錄成功后的源碼為:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>myblog</title>
</head>
<body>
<h1>這個站點的名字為 myblog </h1>
</body>
</html>

哦橱乱,對了,沒有引用bootstrap的基模板粱甫,修改index.html的模板代碼泳叠,將第一行的

{% extends "base.html" %}

修改為

{% extends "bootstrap/base.html" %}

刷新為:

<!DOCTYPE html>
<html>
  <head>
    <title>blog</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- Bootstrap -->
    <link  rel="stylesheet">
  </head>
  <body>
    <h1>這個站點的名字為 myblog </h1>
  </body>
</html>

看到已經(jīng)成功引用了bootstrap框架,但是導航部分全部都沒有茶宵,這時當然不能在寫一遍導航危纫,直接修改自定義的基模板,然后讓其他模板引用即可乌庶,修改基模板為:

{%extends "bootstrap/base.html "%}
{% block title%}牛博客 {% endblock %}<!--覆蓋title標簽-->

{% block navbar %}
<nav class="navbar navbar-inverse"><!-- 導航部分 -->
  導航
</nav>
{% endblock %}
{% block content %} <!--具體內(nèi)容-->
<div class="container">
</div>
{% endblock %}

然后修改首頁代碼:

{% extends "base.html" %}

{% block content %}
 <h1>這個站點的名字為 {{site_name}} </h1>
{% endblock %}

修改登錄頁代碼為:

{% extends "base.html"%}
{% block content %} <!--具體內(nèi)容-->
<div class="container">
    <form method="post">
      <div class="form-group">
        <label for="username">用戶名</label>
        <input type="text" class="form-control" name="username" id="username" placeholder="請輸入用戶名">
      </div>
      <div class="form-group">
        <label for="passworld">密碼</label>
        <input type="password" class="form-control" name="password" id="passworld" placeholder="請輸入密碼">
      </div>
      <button type="submit" class="btn btn-default">登錄</button>
    </form>
</div>
{% endblock %}

下面登錄成功頁的顯示結(jié)果為:


頁面風格與登錄頁保持了一致种蝶,但是,目前還是如果用戶名密碼錯誤(即輸入的不是test和123)瞒大,那么除了和剛剛一樣返回一個登錄錯誤的字符串之外螃征,用戶是無法獲悉的,就需要一個反應用戶狀態(tài)的方法透敌,這一點盯滚,flask提供了flash函數(shù),下面繼續(xù)修改default.py文件:

from flask import flash

@app.route("/login",methods=["POST"])
def loginPost():
    username=request.form.get("username","")
    password=request.form.get("password","")
    if username=="test" and password=="123" :
        session["user"]=username
        return render_template("/index.html",name=username,site_name='myblog')
    else:
        flash("您輸入的用戶名或密碼錯誤")
        return render_template("/login.html") #返回的仍為登錄頁

修改login.html模板:

{% extends "base.html"%}
{% block content %} <!--具體內(nèi)容-->
<div class="container">

    {% for message in get_flashed_messages() %}
    <div class="alert alert-warning">
      <button type="button" class="close" data-dismiss="alter">&times</button>
      {{message}}
    </div>
    {% endfor %}

    <form method="post">
      <div class="form-group">
        <label for="username">用戶名</label>
        <input type="text" class="form-control" name="username" id="username" placeholder="請輸入用戶名">
      </div>
      <div class="form-group">
        <label for="passworld">密碼</label>
        <input type="password" class="form-control" name="password" id="passworld" placeholder="請輸入密碼">
      </div>
      <button type="submit" class="btn btn-default">登錄</button>
    </form>
</div>
{% endblock %}

好下面輸入test和1234酗电,顯示結(jié)果為:

狀態(tài)很完美的顯示出來魄藕。

繼續(xù)美化

登錄的頁面和控制器的基本功能都已經(jīng)完成,但是僅僅就現(xiàn)在這個頁面來說撵术,沒有登錄框占整個屏幕的背率,一般來說,都是居中的一部分荷荤,這塊不涉及flask的部分退渗,輪到bootstrap的柵格系統(tǒng)登場了移稳。

柵格系統(tǒng)簡單說就是將一個container或container-fluid中分為12個列蕴纳,每個列都可以合并或偏移,與html中的table類似个粱,并且支持響應式古毛,通過xs,sm,md稻薇,lg來進行不同屏幕尺寸的區(qū)分嫂冻。下面用柵格系統(tǒng)對登錄頁進行一下修改:

{% extends "base.html"%}
{% block content %} <!--具體內(nèi)容-->
<div class="container">
    <div class="row"></div>
    <div class="row">
        <#-- col-md-4表示合并4列,col-md-offset-4表示偏移4列 sm意思相同 --#>
        <div class="col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3">
            <div class="page-header">
                <h1>歡迎您登陸</h1>
            </div>
            {% for message in get_flashed_messages() %}
            <div class="alert alert-warning">
              <button type="button" class="close" data-dismiss="alter">&times</button>
              {{message}}
            </div>
            {% endfor %}

            <form method="post">
              <div class="form-group">
                <label for="username">用戶名</label>
                <input type="text" class="form-control" name="username" id="username" placeholder="請輸入用戶名">
              </div>
              <div class="form-group">
                <label for="passworld">密碼</label>
                <input type="password" class="form-control" name="password" id="passworld" placeholder="請輸入密碼">
              </div>
              <button type="submit" class="btn btn-default">登錄</button>
            </form>
        </div>
    </div>
</div>
{% endblock %}

顯示結(jié)果如下:

畢竟不是專業(yè)美工塞椎,沒有經(jīng)過設計桨仿,但至少比剛剛美觀多了,但登錄的用戶名和密碼寫成固定值肯定是不行的案狠,數(shù)據(jù)庫是必不可少的服傍,將在下一章讓flask和mysql進行互聯(lián)。

春節(jié)假期很快就過去了骂铁,這篇文章磕磕巴巴的至少更新了三章吹零,再次感到對不起語文老師。明天開始要帶小公舉進行魔都迪士尼四日游拉庵,然后回北京也要開始找工作了灿椅,這個系列的更新可能會不如之前的穩(wěn)定(但發(fā)現(xiàn)也沒什么人看(┳_┳)... ,但扣除魔都游的四天钞支,至少要保證一周一更吧茫蛹,也是對自己的一個鞭策,感謝所有的朋友)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伸辟,一起剝皮案震驚了整個濱河市麻惶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌信夫,老刑警劉巖窃蹋,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異静稻,居然都是意外死亡警没,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門振湾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杀迹,“玉大人,你說我怎么就攤上這事押搪∈骼遥” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵大州,是天一觀的道長续语。 經(jīng)常有香客問我,道長厦画,這世上最難降的妖魔是什么疮茄? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任滥朱,我火速辦了婚禮,結(jié)果婚禮上力试,老公的妹妹穿的比我還像新娘徙邻。我一直安慰自己,他們只是感情好畸裳,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布缰犁。 她就那樣靜靜地躺著,像睡著了一般怖糊。 火紅的嫁衣襯著肌膚如雪民鼓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天蓬抄,我揣著相機與錄音丰嘉,去河邊找鬼。 笑死嚷缭,一個胖子當著我的面吹牛饮亏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阅爽,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼路幸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了付翁?” 一聲冷哼從身側(cè)響起简肴,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎百侧,沒想到半個月后砰识,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡佣渴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年辫狼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辛润。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡膨处,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出砂竖,到底是詐尸還是另有隱情真椿,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布乎澄,位于F島的核電站突硝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏三圆。R本人自食惡果不足惜狞换,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望舟肉。 院中可真熱鬧修噪,春花似錦、人聲如沸路媚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽整慎。三九已至脏款,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間裤园,已是汗流浹背撤师。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拧揽,地道東北人剃盾。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像淤袜,于是被迫代替她去往敵國和親痒谴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

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