摘要:處理和函數(shù)之間關(guān)系的程序稱為路由。模板引擎是由實(shí)現(xiàn)的是內(nèi)置的模板語(yǔ)言參照設(shè)計(jì)思想設(shè)計(jì)的,跟差不多渲染模板默認(rèn)情況下,在程序文件夾中的子文件夾中尋找模板。如果需要可在文件夾中使用子文件夾存放文件。
1 程序的基本結(jié)構(gòu) 1.1初始化
所有Flask 程序都必須創(chuàng)建一個(gè)程序?qū)嵗eb 服務(wù)器使用一種名為Web 服務(wù)器網(wǎng)關(guān)接口(Web Server Gateway Interface,WSGI)的協(xié)議,把接收自客戶端的所有請(qǐng)求都轉(zhuǎn)交給這個(gè)對(duì)象處理。程序?qū)嵗荈lask 類的對(duì)象。
from flask import Flask app = Flask(__name__)
傳入Flask構(gòu)造方法的第一個(gè)參數(shù)是模塊或者包的名稱,我們應(yīng)該使用特殊變量 __name __。
Python會(huì)根據(jù)所處的模塊來(lái)賦予 __ name __變量相應(yīng)的值,對(duì)于我們程序來(lái)說(shuō),這個(gè)值為app
客戶端(例如Web 瀏覽器)把請(qǐng)求發(fā)送給Web 服務(wù)器,Web 服務(wù)器再把請(qǐng)求發(fā)送給Flask
程序?qū)嵗3绦驅(qū)嵗枰缹?duì)每個(gè)URL 請(qǐng)求運(yùn)行哪些代碼,所以保存了一個(gè)URL 到Python 函數(shù)的映射關(guān)系。處理URL 和函數(shù)之間關(guān)系的程序稱為路由。
@app.route("/") def index(): return "Hello World!
"
在這個(gè)程序中,app.route()裝飾器把根地址/和index()函數(shù)綁定起來(lái),當(dāng)用戶訪問這個(gè)URL時(shí)就會(huì)觸發(fā)index()函數(shù)。視圖函數(shù)index()返回 " Hello World! "
route()裝飾器的第一個(gè)參數(shù)是URL規(guī)則,用字符串表示,必須以/開始。這里的URL是相對(duì)的URL(又稱內(nèi)部URL),即不包含域名的URL,以域名www.google.com為例,“/”對(duì)應(yīng)的是根地址,即www.google.com,如果把URL規(guī)則改為“/maps”,則實(shí)際的絕對(duì)地址為www.google.com/maps
如果你仔細(xì)觀察日常所用服務(wù)的某些URL 格式,會(huì)發(fā)現(xiàn)很多地址中都包含可變部分。例如, 你的Facebook 資料頁(yè)面的地址是http://www.facebook.com/
@app.route("/user/1.3啟動(dòng)服務(wù)器") def user(name): return " Hello, %s!
" % name
程序?qū)嵗胷un 方法啟動(dòng)Flask 集成的開發(fā)Web 服務(wù)器:
if __name__ == "__main__": app.run(debug=True)
name__==" main__"是Python 的慣常用法,在這里確保直接執(zhí)行這個(gè)腳本時(shí)才啟動(dòng)開發(fā)Web 服務(wù)器。如果這個(gè)腳本由其他腳本引入,程序假定父級(jí)腳本會(huì)啟動(dòng)不同的服務(wù)器,因此不會(huì)執(zhí)行app.run()。
1.4完整的程序示例1.4 hello.py:一個(gè)完整的Flask 程序
from flask import Flask app = Flask(__name__) @app.route("/") def index(): return "1.4 異常捕獲Hello World!
" @app.route("/user/") def user(name): return " Hello, %s!
" % name if __name__ == "__main__": app.run(debug=True)
使用裝飾器的形式去捕獲指定的錯(cuò)誤碼和異常
@app.errorhandler(404) def page_not_found(error): return "404"1.5請(qǐng)求鉤子
為了讓每個(gè)視圖函數(shù)避免編寫重復(fù)功能的代碼,F(xiàn)lask提供了通用設(shè)施的功能,即請(qǐng)求鉤子。
請(qǐng)求鉤子是通過(guò)裝飾器的形式實(shí)現(xiàn),F(xiàn)lask支持如下四種請(qǐng)求鉤子:
2 模板before_first_request:注冊(cè)一個(gè)函數(shù),在處理第一個(gè)請(qǐng)求之前運(yùn)行。
before_request:注冊(cè)一個(gè)函數(shù),在每次請(qǐng)求之前運(yùn)行。
after_request:注冊(cè)一個(gè)函數(shù),如果沒有未處理的異常拋出,在每次請(qǐng)求之后運(yùn)行。
teardown_request:注冊(cè)一個(gè)函數(shù),即使有未處理的異常拋出,也在每次請(qǐng)求之后運(yùn)行。
--
模板是一個(gè)包含響應(yīng)文本的文件,其中包含用占位變量表示的動(dòng)態(tài)部分,其具體值只在請(qǐng)求的上下文中才能知道。使用真實(shí)值替換變量,再返回最終得到的響應(yīng)字符串,這一過(guò)程稱為渲染。為了渲染模板,F(xiàn)lask 使用了一個(gè)名為Jinja2 的強(qiáng)大模板引擎。
2.1 Jinja2模板引擎2.1.1渲染模板Jinjia2是由python實(shí)現(xiàn)的
是Flask內(nèi)置的模板語(yǔ)言
參照Django設(shè)計(jì)思想設(shè)計(jì)的,跟Django差不多
默認(rèn)情況下,F(xiàn)lask 在程序文件夾中的templates 子文件夾中尋找模板。Flask提供的
示例 hello.py : 渲染模板
from flask import Flask, render_template # ... @app.route("/") def index(): return render_template("index.html") @app.route("/user/") def user(name): return render_template("user.html", name=name)
示例 templates/index.html:Jinja2 模板
Hello World!
示例
Hello, {{ name }}!
render_template 函數(shù)封裝了該模板引擎
render_template 函數(shù)的第一個(gè)參數(shù)是模板的文件名,后面的參數(shù)都是鍵值對(duì),表示模板中變量對(duì)應(yīng)的真實(shí)值
在模板中使用的{{ name }} 結(jié)構(gòu)表示一個(gè)變量,它是一種特殊的占位符,告訴模
板引擎這個(gè)位置的值從渲染模板時(shí)使用的數(shù)據(jù)中獲取。
可以使用過(guò)濾器修改變量,過(guò)濾器名添加在變量名之后,中間使用豎線分隔。例如,下述模板以首字母大寫形式顯示變量name 的值:
Hello, {{ name|capitalize }}
Jinja2 提供的部分常用過(guò)濾器
表 Jinja2變量過(guò)濾器
過(guò)濾器名 | 說(shuō)明 |
---|---|
safe | 渲染值時(shí)不轉(zhuǎn)義 |
capitalize | 把值的首字母轉(zhuǎn)換成大寫,其他字母轉(zhuǎn)換成小寫 |
lower | 把值轉(zhuǎn)換成小寫形式 |
upper | 把值轉(zhuǎn)換成大寫形式 |
title | 把值中每個(gè)單詞的首字母都轉(zhuǎn)換成大寫 |
trim | 把值的首尾空格去掉 |
striptags | 渲染之前把值中所有的HTML 標(biāo)簽都刪掉 |
Jinja2 提供了多種控制結(jié)構(gòu),可用來(lái)改變模板的渲染流程。
條件控制:
{% if user %} Hello, {{ user }}! {% else %} Hello, Stranger! {% endif %}
循環(huán)控制:
宏
{ % macro render_comment(comment) % }
在模板中,可能會(huì)遇到以下問題
多個(gè)模板具有完全相同的頂部和底部?jī)?nèi)容
多個(gè)模板中具有相同的模板代碼內(nèi)容,但是內(nèi)容中部分值不一樣
多個(gè)模板中具有完全相同的 html 代碼塊內(nèi)容
像遇到這種情況,可以使用 JinJa2 模板中的 宏、繼承、包含來(lái)進(jìn)行實(shí)現(xiàn)
標(biāo)簽定義的內(nèi)容
{% block %} {% endblock %}
模板繼承是為了重用模板中的公共內(nèi)容。一般Web開發(fā)中,繼承主要使用在網(wǎng)站的頂部菜單、底部。這些內(nèi)容可以定義在父模板中,子模板直接繼承,而不需要重復(fù)書寫。
首先創(chuàng)建一個(gè)名為base.html 的基模板
{% block head %}{% block title %}{% endblock %} - My Application {% endblock %} {% block body %} {% endblock %}
block 標(biāo)簽定義的元素可在衍生模板中修改。在本例中,我們定義了名為head、title 和
body 的塊。注意,title 包含在head 中。下面這個(gè)示例是基模板的衍生模板:
{% extends "base.html" %} {% block title %}Index{% endblock %} {% block head %} {{ super() }} {% endblock %} {% block body %}Hello, World!
{% endblock %}
extends 指令聲明這個(gè)模板衍生自base.html。在extends 指令之后,基模板中的3 個(gè)塊被
重新定義,模板引擎會(huì)將其插入適當(dāng)?shù)奈恢谩W⒁庑露x的head 塊,在基模板中其內(nèi)容不
是空的,所以使用super() 獲取原來(lái)的內(nèi)容。
Bootstrap(http://getbootstrap.com/)是Twitter 開發(fā)的一個(gè)開源框架,它提供的用戶界面組
件可用于創(chuàng)建整潔且具有吸引力的網(wǎng)頁(yè),而且這些網(wǎng)頁(yè)還能兼容所有現(xiàn)代Web 瀏覽器。
Bootstrap 是客戶端框架,因此不會(huì)直接涉及服務(wù)器。服務(wù)器需要做的只是提供引用了
Bootstrap 層疊樣式表(CSS) 和JavaScript 文件的HTML 響應(yīng), 并在HTML、CSS 和
JavaScript 代碼中實(shí)例化所需組件。這些操作最理想的執(zhí)行場(chǎng)所就是模板。
初始化Flask-Bootstrap
from flask.ext.bootstrap import Bootstrap # ... bootstrap = Bootstrap(app)
初始化 Flask-Bootstrap 之后,就可以在程序中使用一個(gè)包含所有 Bootstrap 文件的基模板。這個(gè)模板利用Jinja2的模板繼承機(jī)制,讓程序擴(kuò)展一個(gè)具有基本頁(yè)面結(jié)構(gòu)的基模板,其中就有用來(lái)引入 Bootstrap 的元素。官方教程
{% extends "bootstrap/base.html" %} {% block title %}Flasky{% endblock %} {% block navbar %}2.3 自定義錯(cuò)誤頁(yè)面 {% endblock %} {% block content %}{% endblock %}Hello, {{ name }}!
像常規(guī)路由一樣,F(xiàn)lask 允許程序使用基于模板的自定義錯(cuò)誤頁(yè)面。最常見的錯(cuò)誤代碼有
兩個(gè):404,客戶端請(qǐng)求未知頁(yè)面或路由時(shí)顯示;500,有未處理的異常時(shí)顯示。
例 hello.py:自定義錯(cuò)誤頁(yè)面
@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"), 5002.4 鏈接
在模板中直接編寫簡(jiǎn)單路由的 URL 鏈接不難,但對(duì)于包含可變部分的動(dòng)態(tài)路由,在模板中構(gòu)建正確的 URL 就很困難。而且,直接編寫 URL 會(huì)對(duì)代碼中定義的路由產(chǎn)生不必要的依賴關(guān)系。如果重新定義路由,模板中的鏈接可能會(huì)失效。Flask 提供了 url_for() 輔助函數(shù),它可以使用程序 URL 映射中保存的信息生成 URL。
2.5 靜態(tài)文件用靜態(tài)文件,例如 HTML代碼中引用的圖片、JavaScript 源碼文件和 CSS。默認(rèn)設(shè)置下,Flask 在程序根目錄中名為 static 的子目錄中尋找靜態(tài)文件。如果需要,可在static 文件夾中使用子文件夾存放文件。
如索引圖標(biāo)的位置{{ url_for("static", filename = "favicon.ico") }}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44942.html
摘要:在談中框架和框架的區(qū)別之前,我們需要先探討如下幾個(gè)問題。通過(guò)大數(shù)據(jù)統(tǒng)計(jì)分析全球著名的網(wǎng)站對(duì)和這兩個(gè)框架的調(diào)查分析。從全球著名的代碼托管平臺(tái)上的和數(shù)量上分別為,分別為。 在談Python中Django框架和Flask框架的區(qū)別之前,我們需要先探討如下幾個(gè)問題。 一、為什么要使用框架? showImg(https://segmentfault.com/img/remote/14600000...
摘要:上一篇文章手把手教你如何用構(gòu)建技術(shù)文章聚合平臺(tái)一介紹了如何使用搭建的運(yùn)行環(huán)境,并且將與集成,對(duì)掘金進(jìn)行技術(shù)文章的抓取,最后可以查看抓取結(jié)果。本篇文章將繼續(xù)講解如何利用編寫一個(gè)精簡(jiǎn)的聚合平臺(tái),將抓取好的文章內(nèi)容展示出來(lái)。 上一篇文章《手把手教你如何用Crawlab構(gòu)建技術(shù)文章聚合平臺(tái)(一)》介紹了如何使用搭建Crawlab的運(yùn)行環(huán)境,并且將Puppeteer與Crawlab集成,對(duì)掘金、...
摘要:而在國(guó)內(nèi)確實(shí)用的人太少,國(guó)內(nèi)的主流服務(wù)端語(yǔ)言都被霸占。因此,在進(jìn)行調(diào)研和諸多權(quán)衡后,團(tuán)隊(duì)選擇了作為第二支持語(yǔ)言。整體上使用開發(fā),也用了一些的特性,之所以用,是因?yàn)閷?duì)于項(xiàng)目的開發(fā)和維護(hù)有極大的益處。 初衷 lin-cms是我們林間有風(fēng)團(tuán)隊(duì)開源的一款CMS,它采用目前主流的前后端分離的架構(gòu),前端使用vue作為基礎(chǔ)框架,后端選擇了我們團(tuán)隊(duì)大量實(shí)踐使用的flask作為基礎(chǔ)框架。 lin-cms...
摘要:從零開始用搭建一個(gè)網(wǎng)站一介紹了如何搭建環(huán)境,以及應(yīng)用基本項(xiàng)目結(jié)構(gòu)。我們要搭建的網(wǎng)站是管理第三方集成的控制臺(tái),類似于。我們先定義一個(gè)用戶模型然后在文件夾下創(chuàng)建一個(gè)文件。 從零開始用 Flask 搭建一個(gè)網(wǎng)站(一) 介紹了如何搭建 Python 環(huán)境,以及 Flask 應(yīng)用基本項(xiàng)目結(jié)構(gòu)。我們要搭建的網(wǎng)站是管理第三方集成的控制臺(tái),類似于 Slack。 本篇主要講解數(shù)據(jù)如何在 Flask 應(yīng)用...
閱讀 2847·2021-09-28 09:36
閱讀 3937·2021-09-22 15:52
閱讀 3630·2021-09-06 15:00
閱讀 1947·2021-09-02 15:40
閱讀 2798·2021-09-02 15:15
閱讀 3454·2021-08-17 10:15
閱讀 2781·2019-08-30 15:53
閱讀 2073·2019-08-29 18:39