【二】Flask 中的路由

保留傳統(tǒng),先插入封面

????前情回顧
上次我們著手寫了第一個(gè)flask的應(yīng)用.運(yùn)行它之后當(dāng)我們訪問http://127.0.0.1:5000/
時(shí)就會(huì)出現(xiàn)我們對應(yīng)的信息

這個(gè)地址后面所帶的路徑是/
也就是我們的跟路徑,但是在我們的平時(shí)上網(wǎng)時(shí)所看到的絕大多數(shù)站點(diǎn)都是由許許多多的頁面所組成.
比如bilibili的視頻播放頁面和專欄的頁面就是兩個(gè)獨(dú)立的路徑
這個(gè)地址后面所帶的路徑是/
也就是我們的跟路徑,但是在我們的平時(shí)上網(wǎng)時(shí)所看到的絕大多數(shù)站點(diǎn)都是由許許多多的頁面所組成.
比如bilibili的視頻播放頁面和專欄的頁面就是兩個(gè)獨(dú)立的路徑


假如說我們現(xiàn)在有一個(gè)網(wǎng)站,它非常簡單由首頁和用戶頁面來構(gòu)成
我們改如何實(shí)現(xiàn)它呢?
簡單路由
我們回過頭來看我們的helloword程序是怎么樣來實(shí)現(xiàn)一個(gè)頁面的
@app.route("/")
def hello_world()
: ? ?return "hello"
首先第一行是app.route("/")
裝飾器,這也是我們一個(gè)頁面的核心
route是路由的意思,加入我們想讓http://127.0.0.1:5000/hello
可以被訪問到,我們只需要把/
改成/hello
即可
@app.route("/hello")
def hello_world():
? ? return "hello"
?
這時(shí)候我們再去訪問/
的話就訪問不到了
但是hello確實(shí)可以訪問到的

route("/hello")中
.app.route()
的意思就是為下面的函數(shù)來注冊一個(gè)URL
可以來執(zhí)行這個(gè)函數(shù)地下的內(nèi)容,這個(gè)函數(shù)被稱為視圖函數(shù)
,這個(gè)函數(shù)的返回值就是我們在頁面上看到的結(jié)果
Q:能不能實(shí)現(xiàn)一個(gè)視圖函數(shù)綁定多個(gè)url
?
A:是可以的
嘗試一下
回到上面舉的"栗子",有一個(gè)頁面有主頁
和用戶
頁面來構(gòu)成
我們應(yīng)該怎么來實(shí)現(xiàn)呢?
首先來注冊主頁
@app.route("/index")
def index():
? ? return "這里是主頁"
然后下面就是有幾個(gè)頁面就寫幾個(gè)這樣的視圖函數(shù)了
@app.route("/user")
def user():
? ? return "這里是用戶頁面"
來訪問一下試試(記得重啟服務(wù)器)


可能你會(huì)說,哪有主頁不是一點(diǎn)就進(jìn)去的呢?
我想訪問'/'也能訪問到主頁應(yīng)該怎么做呢.這就要用到一個(gè)視圖函數(shù)綁定多個(gè)URL
的方式了
直接在視圖函數(shù)上面寫裝飾器即可
@app.route("/")
@app.route("/index")
def index():
? ? return "這里是主頁"

這樣訪問的時(shí)候就不需要輸入/index
了
攜帶參數(shù)
你也許發(fā)現(xiàn)了,在剛剛的bilibili頁面中視頻播放頁面的url后面帶了av號作為參數(shù)
這樣我們的應(yīng)用才知道用戶想要播放哪個(gè)視頻節(jié)目
同樣的,這就要用到了路由參數(shù)的功能,畢竟我們不能把每個(gè)用戶都寫一個(gè)視圖函數(shù)吧
比如說下面這個(gè)函數(shù)就會(huì)根據(jù)不同用戶傳入的用戶名來將用戶名返回到頁面上
@app.route("/user/<username>")
def me(username):
? ? return "歡迎" + username + "蒞臨指導(dǎo)!"

你也可以一下子傳入多個(gè)值,但是你得把他們表示清楚
@app.route("/user/<username>/<msg>")
def me(username, msg):
? ? return username+"說:" + msg
參數(shù)中間的/
是必須的,因?yàn)槿绻麤]有兩個(gè)字符串就會(huì)當(dāng)做一個(gè)來看,服務(wù)器永遠(yuǎn)不會(huì)找得到你這個(gè)頁面

獲取到的參數(shù)也可以在代碼中直接使用,因?yàn)樗且押瘮?shù)的形式變量的方式傳入的
比如:
@app.route("/user/<username>/<msg>")
def me(username, msg):
? ? print("%s說:%s" % (username, msg))
? ? return username+"說:" + msg

規(guī)定參數(shù)的類型:
默認(rèn)情況下,這里的參數(shù)以字符串的方式進(jìn)行讀取,也就是說你可以在這里傳入任何字符串
Q:那我能不能只規(guī)定數(shù)字能被讀取
A:當(dāng)然是可以的
你可以使用<類型:變量>
這樣的方式進(jìn)行規(guī)定
@app.route("/user/<int:usernum>")
def user(usernum):
? ? print(type(usernum))
? ? return "編號: " + str(usernum)

可以在控制臺看到類型是int
型

這些規(guī)定都是由flask自己已經(jīng)定義好的一些標(biāo)識符,但是你也可以自己通過正則表達(dá)式來定義一個(gè)屬于自己的格式路由,相關(guān)的內(nèi)容可以自行百度解決
最后一點(diǎn)
也許你也正在遭受每次修改代碼都要重啟服務(wù)器的苦惱,那就來試試Flask的debug模式吧,打開debug之后當(dāng)你保存文件后flask會(huì)自動(dòng)重啟
當(dāng)你在視圖函數(shù)遇到錯(cuò)誤的時(shí)候常??吹降氖沁@樣的錯(cuò)誤信息
比如說這是因?yàn)闆]有類型轉(zhuǎn)換而造成的無法將int與str進(jìn)行連接的錯(cuò)誤
@app.route("/user/<int:usernum>")
def user(usernum):
? ? print(type(usernum))
? ? return "編號: " + usernum # 錯(cuò)誤在這里 應(yīng)該改為str(usernum)
這時(shí)服務(wù)器將會(huì)返回一個(gè)500錯(cuò)誤

開啟debug模式后

將會(huì)直接出現(xiàn)錯(cuò)誤信息
如何開啟這個(gè)DEBUG?
1 app.run()
中直接傳入
if __name__ == '__main__':
? ? app.run(debug=True)
2 在app.config
中設(shè)置
app.config
是一個(gè)全局的app配置信息,他是一個(gè)字典,我們以后將會(huì)經(jīng)常用到它的
from flask import Flask
app = Flask(__name__)
app.config["DEBUG"] = True
3 命令行中使用debugger
需要設(shè)置如下環(huán)境變量
FLASK_ENV=development
小結(jié)一下
這一次我們主要是演示了怎么樣在flask中注冊不同的頁面以及如何使用路由傳遞參數(shù).
今天第二項(xiàng)內(nèi)容就是我們演示了怎么樣在flask啟動(dòng)調(diào)試模式
這些內(nèi)容都非常簡單,如果你想快速入門flask我建議你去閱讀一本叫做《Flask Web 入門開發(fā)實(shí)戰(zhàn)》(這不是廣告)

下一節(jié)我們來一起看看怎么樣展示出一個(gè)漂亮的網(wǎng)頁