iT邦幫忙

2021 iThome 鐵人賽

DAY 13
1

首先,作為一個 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 啦,基礎大概就這樣。

To / 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,那又可以開另外一個系列了)。

url_for

如果現在要回傳一個網址給使用者,而這個網址又很長,那當然不可能使用ctrl + cctrl + 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

如果現在需要將使用者導向到另一個頁面,可以怎麼做呢?

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'

大概就像這樣,處裡完就會將使用者導向另一個頁面,不需要讓使用者自己手動跳轉,提高使用者體驗。

那麼就大概這樣,處理好路由,網站的形狀就出來了,接著就可以處力其他東西了。

大家掰~掰~


上一篇
Day 12 Flask 基本設定
下一篇
Day 14 Flask 傳入參數
系列文
月光下的Flask之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言