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>
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)