首先,作為一個 Web 的框架,主要就是當作網頁的 Server 在運作的,網頁中必不可少的就是網址了對吧,那麼 Flask 至少要可以針對請求的網址進行回傳資料吧!
在實際開始做之前,先簡單說一下 POSTMAN 這個東西,POSTMAN 主要是讓你可以更自由的選擇要怎麼送出 url 的一個工具。
基本上到 POSTMAN官網下載頁面 下載安裝(就下一步到底,然後就安裝完了),然後申請一個帳號(要啥填啥就對了,也可以使用 google 帳號)登入就可以使用了,打開後會看到類似這樣的畫面,紅色區域(中上)是輸入 url 跟 method 的區域;綠色區域(右上)是送出;藍色區域(中間)是輸入要攜帶的參數;橘色區域(下方)是顯示回傳結果的地方。如果一個不夠,紅色區域的上方還有加號可以增加分頁,讓你可以一次可以使用更多種不同的東西。
那要回復請求要怎麼寫呢?
@app.route('<url>', methods=['<method>'])
def <function name>():
# TODO
回復請求的方式大概是這樣,function 前面加個 Day 08 講到的裝飾器。url 就填網址,methods (可寫可不寫,裡面的 method 要大寫,要有 s
,當初為了這個 s
找了一下午的bug)就是送的方式,function name 就自己取個有意義的名字,function 裡面就寫這個 function 要幹嘛。
順便再說一下,url 可以使用 [A-Z, a-z, 0-9, -] 這幾個字符組成。那麼工具齊全了,就實際來做幾個試試吧!
app.py
from flask import Flask
app = Flask(__name__)
# 首頁,不限 methods
@app.route('/')
def index():
return 'Hello World'
# POST methods(POST 大寫,要有s跟中括號)
@app.route('/posttest', methods=['POST'])
def posttest():
return 'post test success'
if __name__ == '__main__':
app.run()
接著執行
# 使用虛擬環境的輸入
$ pipenv run python app.py
# 不使用虛擬環境的輸入
$ python app.py
然後打開安裝好了的 POSTMAN,選好 POST 以及輸入 url: http://127.0.0.1:5000/posttest
,接著送出就會看到
在這邊也可以試試,如果換成 GET 會發生什麼事?
回傳了一個看起來很複雜的東西對吧,把回傳區塊的 Pretty 改成選擇 Preview 看看。
是不是很清楚的寫著不合的 method 啦,基礎大概就這樣。
/
or not to /
如果上各種網站時,你有注意到網址的結尾有些有 /
;有些沒有 /
,看其他人的網站時,有沒有 /
都不會影響你瀏覽。不過自己在寫就不一樣了,那 url 結尾有沒有 /
到底差在哪呢?
@app.route('/A/')
def a_page():
return 'A page'
@app.route('/B')
def b_page():
return 'B page'
簡單說有 /
就像資料夾。如果輸入的是沒有 /
的 url,網站沒有無 /
的 url 的話,就會重新導向有 /
的 url。就相當於沒有找到檔案就打開同名的資料夾裡面的默認檔案。
而沒有 /
就像檔案。如果輸入的是有 /
的 url,網站沒有有 /
的 url 的話,就會 404 Not Found,不會幫你重新導向。
這兩種方式都可以使用,一開始只需要知道 /A/
跟 /A
是兩個不同的網頁就行了(如果真的要說的話會扯到SEO,那又可以開另外一個系列了)。
如果現在要回傳一個網址給使用者,而這個網址又很長,那當然不可能使用ctrl + c
與 ctrl + v
大法對吧。所以就需要使用到 url_for() 這個功能,那要如何使用呢?
url_for('<function name>')
function name 就填那個路由的 function 名稱,在使用之前記得 import url_for(from flask import url_for
)。實作一個會更清楚:
@app.route('/')
def index():
return '<a href="{}">login</a>'.format(url_for('login'))
@app.route('/login/')
def login():
return 'login page'
這樣的好處就是可以不用在意 login 的 url,即使之後改掉 url,只要 function 名稱還是 login 就還是可以對到正確的位置。
如果現在需要將使用者導向到另一個頁面,可以怎麼做呢?
redirect('<url>')
# or
redirect(url_for('<function name>'))
這樣就可以直接將使用者到到另一個網址了,在使用之前一樣要 import redirect(from flask import redirects
)。大概就像這樣:
@app.route('/')
def index():
return '<a href="{}">login</a>'.format(url_for('login'))
@app.route('/login/')
def login():
# Authenticate user
if auth_result == 'success':
return redirect(url_for('home'))
else:
return redirect(url_for('index'))
@app.route('/home/')
def home():
return 'home page'
大概就像這樣,處裡完就會將使用者導向另一個頁面,不需要讓使用者自己手動跳轉,提高使用者體驗。
那麼就大概這樣,處理好路由,網站的形狀就出來了,接著就可以處力其他東西了。
大家掰~掰~