第三講一小時(shí)學(xué)會(huì)Flask框架(一)

Flask框架

為什么要學(xué)習(xí)Flask?

  • Flask自由坷澡、靈活豆挽,可擴(kuò)展性強(qiáng)育谬,第三方庫(kù)的選擇面廣,開發(fā)時(shí)可以結(jié)合自己最喜歡用的輪子祷杈,也能結(jié)合最流行最強(qiáng)大的Python庫(kù)
  • 入門簡(jiǎn)單斑司,即便沒有多少web開發(fā)經(jīng)驗(yàn),也能很快做出網(wǎng)站
  • 非常適用于小型網(wǎng)站
  • 非常適用于開發(fā)web服務(wù)的API
  • 開發(fā)大型網(wǎng)站無壓力但汞,但代碼架構(gòu)需要自己設(shè)計(jì),開發(fā)成本取決于開發(fā)者的能力和經(jīng)驗(yàn)
  • 各方面性能均等于或優(yōu)于Django
    Django自帶的或第三方的好評(píng)如潮的功能互站,F(xiàn)lask上總會(huì)找到與之類似第三方庫(kù)
    Flask靈活開發(fā)私蕾,Python高手基本都會(huì)喜歡Flask,但對(duì)Django卻可能褒貶不一
  • Flask與關(guān)系型數(shù)據(jù)庫(kù)的配合使用不弱于Django胡桃,而其與NoSQL數(shù)據(jù)庫(kù)的配合遠(yuǎn)遠(yuǎn)優(yōu)于Django
  • Flask比Django更加Pythonic踩叭,與Python的philosophy更加吻合

簡(jiǎn)介

Flask誕生于2010年,是Armin ronacher(人名)用Python語(yǔ)言基于Werkzeug工具箱編寫的輕量級(jí)Web開發(fā)框架翠胰。它主要面向需求簡(jiǎn)單的小應(yīng)用容贝。

Flask本身相當(dāng)于一個(gè)內(nèi)核,其他幾乎所有的功能都要用到擴(kuò)展(郵件擴(kuò)展Flask-Mail之景,用戶認(rèn)證Flask-Login)斤富,都需要用第三方的擴(kuò)展來實(shí)現(xiàn)。比如可以用Flask-extension加入ORM锻狗、窗體驗(yàn)證工具满力,文件上傳焕参、身份驗(yàn)證等。Flask沒有默認(rèn)使用的數(shù)據(jù)庫(kù)油额,你可以選擇MySQL叠纷,也可以用NoSQL。其 WSGI 工具箱采用 Werkzeug(路由模塊) 潦嘶,模板引擎則使用 Jinja2 涩嚣。

可以說Flask框架的核心就是Werkzeug和Jinja2。

Python最出名的框架要數(shù)Django掂僵,此外還有Flask缓艳、Tornado等框架。雖然Flask不是最出名的框架看峻,但是Flask應(yīng)該算是最靈活的框架之一阶淘,這也是Flask受到廣大開發(fā)者喜愛的原因。
Flask的Github地址:https://github.com/pallets/flask
Flask中文文檔地址:http://docs.jinkan.org/docs/flask/

Flask入門程序示例(從Hello World開始)

為加快開發(fā)效率互妓,我們使用Pycharm的professional版本進(jìn)行創(chuàng)建flask程序

選擇Flask框架然后指定工程的位置和python解釋器環(huán)境溪窒,模板引擎選擇Jinjia2模板的文件夾選擇默認(rèn)的templates文件夾


創(chuàng)建完之后,會(huì)自動(dòng)生成相應(yīng)的配置文件冯勉,運(yùn)行app.run()

在瀏覽器中輸入http://127.0.0.1:5000/

Flask目錄結(jié)構(gòu)

下圖是flask項(xiàng)目的參考目錄結(jié)構(gòu)



由上圖我們可以看出澈蚌,pycharm為我們自動(dòng)創(chuàng)建了static和templates兩個(gè)文件夾,如有其他需求還要我們自行創(chuàng)建灼狰,static文件主要是存放靜態(tài)文件宛瞄,templates存放Jinjia2模板文件
接下來我們重點(diǎn)關(guān)注app.py文件

# 導(dǎo)入Flask類
from flask import Flask

#Flask類接收一個(gè)參數(shù)__name__
# __name__表示當(dāng)前模塊的名字
#模塊名傳入的意義
#flask以這個(gè)模塊所在的目錄為總目錄
# 默認(rèn)這個(gè)目錄中的static文件夾為靜態(tài)文件目錄
# templates為 模板目錄
import demo
app = Flask(__name__)

# 裝飾器的作用是將路由映射到視圖函數(shù)index

@app.route('/')
def index():
    """定義視圖視圖函數(shù)"""
    return 'Hello World!'

# Flask應(yīng)用程序?qū)嵗膔un方法啟動(dòng)WEB服務(wù)器
# 如果當(dāng)前模塊作為啟動(dòng)模塊, __name__ 就是 __main__
# 如果是導(dǎo)入這個(gè)模塊當(dāng)做包被導(dǎo)入交胚,__name__ 是文件的名字
if __name__ == '__main__':
    app.run()

靜態(tài)文件訪問

在static文件夾下新建index.html份汗,并且添加h1標(biāo)題內(nèi)容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Welcome to Flask World</h1>
</body>
</html>

然后我們?cè)L問http://127.0.0.1:5000/static/index.html就可以看到相應(yīng)的效果

如果說我們更改 app = Flask("dsadsadas") 這樣的任意的字符串,按理來說Flask會(huì)去找dsadsadas這個(gè)模塊所在目錄為總目錄蝴簇,但是實(shí)際上并沒有這個(gè)模塊杯活,所以flask找不到,找不到flask會(huì)默認(rèn)當(dāng)前這個(gè)啟動(dòng)文件所在的目錄為總目錄熬词,總目錄下的static文件夾為靜態(tài)文件目錄旁钧,所以訪問http://127.0.0.1:5000/static/index.html仍然可以成功(注意如果測(cè)試字符串是abc,則找不到互拾,因?yàn)闃?biāo)準(zhǔn)庫(kù)里有abc模塊)

路由參數(shù)設(shè)置

我們使用app.url_map查看所有路由歪今,下面演示一些路由設(shè)置,此外還有動(dòng)態(tài)路由和定義請(qǐng)求方式路由

from flask import Flask
app = Flask(__name__)


# 路由
@app.route('/hello')
def index():
    """定義視圖視圖函數(shù)"""
    return 'hello'
# 同一視圖函數(shù)對(duì)應(yīng)多個(gè)裝飾器都可以訪問該視圖函數(shù)
@app.route('/hi1')
@app.route('/hi2')
def hi():
    return 'hi i am here!'
# 查看所有路由
print(app.url_map)
if __name__ == '__main__':
    app.run()

Jinja2模板引擎

使用Flask的render_template渲染模板
在app.py中修改如下代碼

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/index')
def index():
    # 第一個(gè)參數(shù)數(shù)模板的名字颜矿,第二個(gè)參數(shù)是返回值寄猩,平鋪的方式即可
     return render_template("index.html", name='魯班七號(hào)', grade=15)
    # 2. Django 一般都是傳入的字典,如果用類似方式可以這樣
    # **data 代表解包的意思
    data = {
        "name": "安琪拉",
        "grade": 13
    }
    return render_template("index.html", **data)

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

在templates目錄下新建index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>英雄:</h1>
<p>{{ name }}</p>
<h1>等級(jí):</h1>
<p>{{ grade }}</p>
</body>
</html>

訪問http://127.0.0.1:5000/index

Flask過濾器

safe:禁用轉(zhuǎn)義或衡;
<p>{{ '<em>hello</em>' | safe }}</p>
capitalize:把變量值的首字母轉(zhuǎn)成大寫焦影,其余字母轉(zhuǎn)小寫车遂;
<p>{{ 'hello' | capitalize }}</p>
lower:把值轉(zhuǎn)成小寫;
<p>{{ 'HELLO' | lower }}</p>
upper:把值轉(zhuǎn)成大寫斯辰;
<p>{{ 'hello' | upper }}</p>
title:把值中的每個(gè)單詞的首字母都轉(zhuǎn)成大寫舶担;
<p>{{ 'hello' | title }}</p>
trim:把值的首尾空格去掉;
<p>{{ ' hello world ' | trim }}</p>
reverse:字符串反轉(zhuǎn)彬呻;
<p>{{ 'olleh' | reverse }}</p>
format:格式化輸出衣陶;
<p>{{ '%s is %d' | format('name',17) }}</p>
striptags:渲染之前把值中所有的HTML標(biāo)簽都刪掉;
<p>{{ '<em>hello</em>' | striptags }}</p>

支持鏈?zhǔn)绞褂眠^濾器

<p>{{ “ hello world “ | trim | upper }}</p>

在模板目錄index.html下更新如下代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{#支持鏈?zhǔn)讲僮?}
welcome to {{ '     neuedu    '| trim | upper}}
</body>
</html>

Flask內(nèi)置過濾器

Flask提供了一個(gè)內(nèi)置過濾器”tojson”闸氮,它的作用是將變量輸出為JSON字符串剪况。這個(gè)在配合Javascript使用時(shí)非常有用

更新app.py文件 增加json數(shù)據(jù)

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/index')
def index():
    data = '''
       {
       "name": "Python書籍",
       "origin_price": 66,
       "pub_date": "2018-4-14 17:00:00",
       "store": ["京東", "淘寶"],
       "author": ["張三", "李四", "Jhone"],
       "is_valid": true,
       "is_sale": false,
       "meta": {
           "isbn": "abc-123",
           "pages": 300
       },
       "desc": null
       }
       '''
    return render_template("index.html", data=data)

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

更新index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{#支持鏈?zhǔn)讲僮?}
welcome to {{ '     neuedu    '| trim | upper}}
<script>
    var data = {{ data | tojson |safe }}
    console.log(data)
</script>
</body>
</html>

打開瀏覽器控制臺(tái)


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蒲跨,隨后出現(xiàn)的幾起案子译断,更是在濱河造成了極大的恐慌,老刑警劉巖或悲,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孙咪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡巡语,警方通過查閱死者的電腦和手機(jī)翎蹈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來男公,“玉大人荤堪,你說我怎么就攤上這事∈嗯猓” “怎么了澄阳?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)糠爬。 經(jīng)常有香客問我寇荧,道長(zhǎng),這世上最難降的妖魔是什么执隧? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮户侥,結(jié)果婚禮上镀琉,老公的妹妹穿的比我還像新娘。我一直安慰自己蕊唐,他們只是感情好屋摔,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著替梨,像睡著了一般钓试。 火紅的嫁衣襯著肌膚如雪装黑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天弓熏,我揣著相機(jī)與錄音恋谭,去河邊找鬼。 笑死挽鞠,一個(gè)胖子當(dāng)著我的面吹牛疚颊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播信认,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼材义,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了嫁赏?” 一聲冷哼從身側(cè)響起其掂,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎潦蝇,沒想到半個(gè)月后款熬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡护蝶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年华烟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片持灰。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盔夜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出堤魁,到底是詐尸還是另有隱情喂链,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布妥泉,位于F島的核電站椭微,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏盲链。R本人自食惡果不足惜蝇率,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刽沾。 院中可真熱鬧本慕,春花似錦、人聲如沸侧漓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)布蔗。三九已至藤违,卻和暖如春浪腐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背顿乒。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工议街, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淆游。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓傍睹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親犹菱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拾稳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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

  • PythonWeb框架要點(diǎn)、Django介紹腊脱、工程搭建访得、配置、靜態(tài)文件與路由 1.Python Web 框架要點(diǎn) ...
    Cestine閱讀 1,505評(píng)論 0 6
  • Flask簡(jiǎn)介 Flask是一個(gè)相對(duì)于Django而言輕量級(jí)的Web框架陕凹。 和Django大包大攬不同悍抑,F(xiàn)lask...
    愛碼小士閱讀 13,751評(píng)論 1 11
  • 第三章 模板 序 為什么要分離 易于維護(hù)的代碼,關(guān)鍵在于保持簡(jiǎn)單的結(jié)構(gòu)杜耙。而我們之前編寫的hello.py雖然簡(jiǎn)單搜骡,...
    科幻經(jīng)典閱讀 1,537評(píng)論 0 6
  • 1 程序的基本結(jié)構(gòu) 1.1初始化 所有Flask 程序都必須創(chuàng)建一個(gè)程序?qū)嵗eb 服務(wù)器使用一種名為Web 服...
    周闖閱讀 436評(píng)論 0 1
  • 陪朋友去買房佑女,中介特別的注重風(fēng)水记靡,但又似乎不懂風(fēng)水,每一套不同格局团驱,不同朝向的房子摸吠,都被他們說成好風(fēng)水,當(dāng)然嚎花,為了...
    昱杰_05e9閱讀 1,007評(píng)論 0 0