利用pycharm學(xué)習(xí)flask(七)

本文內(nèi)容

1.自定義錯(cuò)誤頁面
2.鏈接
3.靜態(tài)文件
4.使用flask-moment

自定義錯(cuò)誤頁面

在hello.py添加

@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'),404

@app.errorhandler(500)
def internal_server_error(e):
    return render_template('500.html'),500

和視圖函數(shù)一樣,錯(cuò)誤處理程序也會(huì)返回響應(yīng)代承,同時(shí)還返回與該錯(cuò)誤對應(yīng)的數(shù)字狀態(tài)碼。

錯(cuò)誤處理程序中引用的模板也要編寫隐锭,編寫這些模板最直觀的方法是復(fù)制templates/user.html窃躲,分別創(chuàng)建templates/404.html和templates/500.html,然后把這兩個(gè)文件中的頁面頭部元素改為相應(yīng)的錯(cuò)誤消息钦睡。但這種方法帶來很多重復(fù)勞工蒂窒。

我們可以使用Jinja2的模板繼承來解決這個(gè)問題,在pycharm中新建一個(gè)templates/base.html荞怒,內(nèi)容如下:

{% extends "bootstrap/base.html" %}
{% block title %}Flasky{% endblock %}
{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
         <div class="container">
             <div class="navbar-header">
                 <button type="button" class="navbar-toggle"
                  data-toggle="collapse" data-target=".navbar-collapse">
                     <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="/">Flasky</a>
             </div>
             <div class="navbar-collapse collapse">
                 <ul class="nav navbar-nav">
                     <li><a href="/">Home</a></li>
                 </ul>
             </div>
         </div>
</div>
{% endblock %}
{% block content %} <div class="container">
{% block page_content %}{% endblock %} </div>
{% endblock %}

這是一個(gè)繼承自bootstrap/base.html的新模板洒琢,這個(gè)模板也可以作為其他模板的基模板,例如templates/user.html褐桌、templates/404.html衰抑、templates/500.html。

這個(gè)模板的content塊中只有一個(gè)div容器荧嵌,其中包含了一個(gè)page_content的新的空塊呛踊,塊中的內(nèi)容由衍生模板定義。

現(xiàn)在程序使用的模板繼承自這個(gè)base模板啦撮,而不是flask-bootstrap的基模板谭网。

在pycharm中新建templates/404.html:

{% extends "base.html" %}
{% block title %}Flasky - Page Not Found{% endblock %}
{% block page_content %} <div class="page-header">
         <h1>Not Found</h1>
     </div>
{% endblock %}

之后訪問一個(gè)不存在的頁面就會(huì)如圖所示:


我們還可以修改templates/user.html來繼承這個(gè)基模板達(dá)到簡化代碼的作用:

{% extends "base.html" %}
{% block title %}Flasky{% endblock %}
{% block page_content %} 
<div class="page-header">
    <h1>Hello, {{ name }}!</h1>
</div>
{% endblock %}

鏈接

任何具有多個(gè)路由的程序都需要可以連接不同頁面的鏈接,例如導(dǎo)航條赃春。
在模板中直接編寫簡單路由的 URL 鏈接不難蜻底,但對于包含可變部分的動(dòng)態(tài)路由,在模板 中構(gòu)建正確的 URL 就很困難聘鳞。而且,直接編寫 URL 會(huì)對代碼中定義的路由產(chǎn)生不必要的 依賴關(guān)系要拂。如果重新定義路由抠璃,模板中的鏈接可能會(huì)失效。

為了避免這些問題脱惰,F(xiàn)lask 提供了 url_for() 輔助函數(shù)搏嗡,它可以使用程序 URL 映射中保存 的信息生成 URL。url_for() 函數(shù)最簡單的用法是以視圖函數(shù)名(或者 app.add_url_route() 定義路由時(shí)使用 的端點(diǎn)名)作為參數(shù)拉一,返回對應(yīng)的 URL采盒。例如,在當(dāng)前版本的 hello.py 程序中調(diào)用 url_ for('index')得到的結(jié)果是/蔚润。調(diào)用url_for('index', _external=True)返回的則是絕對地 址磅氨,在這個(gè)示例中是 http://localhost:5000/

使用 url_for() 生成動(dòng)態(tài)地址時(shí)嫡纠,將動(dòng)態(tài)部分作為關(guān)鍵字參數(shù)傳入烦租。例如延赌,url_for ('user', name='john', _external=True)的返回結(jié)果是http://localhost:5000/user/john

傳入 url_for() 的關(guān)鍵字參數(shù)不僅限于動(dòng)態(tài)路由中的參數(shù)叉橱。函數(shù)能將任何額外參數(shù)添加到 查詢字符串中挫以。例如,url_for('index', page=2)的返回結(jié)果是/?page=2窃祝。

靜態(tài)文件

默認(rèn)設(shè)置下掐松,F(xiàn)lask 在程序根目錄中名為 static 的子目錄中尋找靜態(tài)文件。如果需要粪小,可在 static 文件夾中使用子文件夾存放文件大磺。服務(wù)器收到前面那個(gè) URL 后,會(huì)生成一個(gè)響應(yīng)糕再, 包含文件系統(tǒng)中 static/css/styles.css 文件的內(nèi)容量没。

修改templates/base.html:

{% block head %}
{{ super() }}
<link rel="shortcut icon" href="{{ url_for('static', filename = 'favicon.ico') }}"
type="image/x-icon">
<link rel="icon" href="{{ url_for('static', filename = 'favicon.ico') }}"
type="image/x-icon"> 
{% endblock %}

圖標(biāo)的聲明會(huì)插入 head 塊的末尾。注意如何使用 super()保留基模板中定義的塊的原始內(nèi)容突想。

使用Flask-Moment本地化日期和時(shí)間

要想在服務(wù)器上只使用 UTC 時(shí)間殴蹄,一個(gè)優(yōu)雅的解決方案是,把時(shí)間單位發(fā)送給 Web 瀏覽 器猾担,轉(zhuǎn)換成當(dāng)?shù)貢r(shí)間袭灯,然后渲染。Web 瀏覽器可以更好地完成這一任務(wù)绑嘹,因?yàn)樗塬@取用 戶電腦中的時(shí)區(qū)和區(qū)域設(shè)置稽荧。

有一個(gè)使用JavaScript開發(fā)的優(yōu)秀客戶端開源代碼庫,名為 moment.js(http://momentjs.com/) 工腋,它可以在瀏覽器中渲染日期和時(shí)間姨丈。Flask-Moment 是一個(gè) Flask 程序擴(kuò)展,能把moment.js集成到Jinja2模板中擅腰。這里我們使用Flask-Moment來本地化日期和時(shí)間蟋恬,在pycharm中preferences中的project interpreter中安裝Flask-Moment插件。

除了moment.js趁冈,F(xiàn)lask-Moment還依賴jquery.js歼争。要在HTML文檔的某個(gè)地方引入這兩個(gè)庫,可以直接引入渗勘,這樣可以選擇使用哪個(gè)版本沐绒,也可使用擴(kuò)展提供的輔助函數(shù),從內(nèi)容 分發(fā)網(wǎng)絡(luò)(Content Delivery Network旺坠,CDN)中引入通過測試的版本乔遮。Bootstrap已經(jīng)引入了 jquery.js,因此只需引入moment.js即可取刃。

修改templates/base.html:

{% block scripts %}
{{ super() }}
{{ moment.include_moment() }} 
{% endblock %}

注意申眼,此處代碼一定要加在最后瞒津,至此我的base.html完整代碼如下:

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

{% block title %}
Flasky
{% endblock %}

{% block head %}
{{ super() }}
<link rel="shortcut icon" href="{{ url_for('static', filename = 'favicon.ico') }}"
type="image/x-icon">
<link rel="icon" href="{{ url_for('static', filename = 'favicon.ico') }}"
type="image/x-icon">
{% endblock %}



{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
         <div class="container">
             <div class="navbar-header">
                 <button type="button" class="navbar-toggle"
                  data-toggle="collapse" data-target=".navbar-collapse">
                     <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="/">Flasky</a>
             </div>
             <div class="navbar-collapse collapse">
                 <ul class="nav navbar-nav">
                     <li><a href="/">Home</a></li>
                 </ul>
             </div>
         </div>
</div>
{% endblock %}
{% block content %}

<div class="container">
{% block page_content %}{% endblock %}
</div>
{% block scripts %}
{{ super() }}
{{ moment.include_moment() }}
{% endblock %}
{% endblock %}

首頁截圖應(yīng)如下:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市括尸,隨后出現(xiàn)的幾起案子巷蚪,更是在濱河造成了極大的恐慌,老刑警劉巖濒翻,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屁柏,死亡現(xiàn)場離奇詭異,居然都是意外死亡有送,警方通過查閱死者的電腦和手機(jī)淌喻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雀摘,“玉大人裸删,你說我怎么就攤上這事≌笤” “怎么了涯塔?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長清蚀。 經(jīng)常有香客問我匕荸,道長,這世上最難降的妖魔是什么枷邪? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任榛搔,我火速辦了婚禮,結(jié)果婚禮上东揣,老公的妹妹穿的比我還像新娘践惑。我一直安慰自己,他們只是感情好嘶卧,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布童本。 她就那樣靜靜地躺著,像睡著了一般脸候。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绑蔫,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天运沦,我揣著相機(jī)與錄音,去河邊找鬼配深。 笑死携添,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的篓叶。 我是一名探鬼主播烈掠,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼羞秤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了左敌?” 一聲冷哼從身側(cè)響起瘾蛋,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矫限,沒想到半個(gè)月后哺哼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叼风,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年取董,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片无宿。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茵汰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孽鸡,到底是詐尸還是另有隱情蹂午,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布梭灿,位于F島的核電站画侣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏堡妒。R本人自食惡果不足惜配乱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望皮迟。 院中可真熱鬧搬泥,春花似錦、人聲如沸伏尼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爆阶。三九已至燥透,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辨图,已是汗流浹背班套。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留故河,地道東北人吱韭。 一個(gè)月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像鱼的,于是被迫代替她去往敵國和親理盆。 傳聞我的和親對象是個(gè)殘疾皇子痘煤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361

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

  • 22年12月更新:個(gè)人網(wǎng)站關(guān)停,如果仍舊對舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,191評論 22 257
  • 第三章 模板 序 為什么要分離 易于維護(hù)的代碼猿规,關(guān)鍵在于保持簡單的結(jié)構(gòu)衷快。而我們之前編寫的hello.py雖然簡單,...
    科幻經(jīng)典閱讀 1,537評論 0 6
  • 第三章 模板(Templates) 編寫易于維護(hù)的程序的要點(diǎn)在于書寫干凈坎拐、良好結(jié)構(gòu)的代碼烦磁。你以前所見的代碼都過于...
    易木成華閱讀 1,142評論 0 2
  • 默認(rèn)情況下,F(xiàn)lask 在程序文件夾中的 templates 子文件夾中尋找模板哼勇。在下一個(gè) hello.py 版本...
    改變自己_now閱讀 8,080評論 0 8
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理都伪,服務(wù)發(fā)現(xiàn),斷路器积担,智...
    卡卡羅2017閱讀 134,716評論 18 139