Python Web — 快速建置網站的Flask套件

Sean Yeh
12 min readAug 19, 2020
Photo by Andrew Neel on Unsplash

一般我們想到Python程式,就會聯想到大數據、資料分析、AI等等的應用範疇;想到架設網站的時候,一般會想到的是PHP、asp.Net、JSP等語言。那麼Python可以拿來架設網站嗎?

其實Python可以藉由安裝各種模組來擴充其功能,在Python的模組中,當然也包含關於網路架構應用的模組。

什麼是Flask?

目前網路程式架構很多,例如Django、Flask、Pyramid、Bottle、Tornado等等,很多很多模組。其中Flask是發佈於2010年的年輕網路架構,吸收其他框架的優點而建立。Flask是一個以 Jinja2範本引擎與Werkzeug WSGI為基礎而建立的網站微框架。

  • The “micro” in microframework means Flask aims to keep the core simple but extensible. Flask won’t make many decisions for you, such as what database to use. Those decisions that it does make, such as what templating engine to use, are easy to change. Everything else is up to you, so that Flask can be everything you need and nothing you don’t.

正如官網上面所揭示的,雖然稱為網站微框架(microframework),卻兼具核心程式碼簡潔以及強大的擴充能力。除此之外,Flask也不會替開發者做任何技術決定,不會替您決定該使用哪種資料庫,但提供各種擴充套件協助整合各種不同資料庫。即便框架中預設採用了Jinja2範本引擎,您還是可以自由的選擇使用其他範本引擎。使用Flask可以讓您建立小而完整(small but complete application )的網路應用程式。

Flask的優點

發佈於2010年的年輕網路架構Flask,它吸收其他框架的優點,受到大家的喜愛。究竟有哪些優點?下面列出Flask的優點:

內建了開發伺服器與偵錯:Flask內建了開發伺服器使開發者在偵錯時無需再安裝其他網路服務器。開發時,Flask預設處於偵錯狀態,執行中發生任何的錯誤,會同時向Python Console以及HTTP Client端發出訊號。

與Python單元測試架構結合:Flask提供一個與Python單元測試架構(unitest)無縫接軌的測試介面。透過這樣的介面,測試程式可以模擬進行HTTP存取的Client端呼叫Flask路由,並且取得函數的輸出來進行程式的驗證。

使用Jinja2樣版引擎:就網路應用程式的HTML來說,Jinja2是個靈活的HTML範本技術,Flask透過使用Jinja2範本引擎,將HTML頁面與後台應用程式聯繫起來。

相容於WSGI標準:WSGI(Web Server Gateway Interface)位於Web應用程式與Web Server中間,目前是Python的主要標準。由於相容於WSGI標準,讓Flask可以方便設定到網路伺服器上面。

Unicode編碼:Flask預設使用Unicode編碼格式的HTTP head,符合主流需求。

免費:使用Flask不需要支付費用,當然不包括寫程式的費用。

安裝Flask

畢竟Flask還是Python的程式之一,我們仍然需要透過pip來安裝Flask套件。

$ pip install Flask

你也可以使用Anaconda來安裝,安裝後會如下畫面。

使用Flask建立第一個網頁

學習程式的第一步,就從Hello World開始。Hello World可以開啟Flask世界的大門。我們現在就從這開始吧。

Hello World

首先匯入flask套件中的Flask類別。

from flask import Flask

建立類別實體app(你也可以命名為別的)。將__name__傳給Flask,讓直接呼叫本模組或透過其他模組呼叫本模組時,都可以使程式工作。

app = Flask(__name__)

使用route()裝飾器。route()裝飾器可以告訴Flask,緊接在裝飾器下面的函式要載入在哪個url位址中。

@app.route('/')

例如下面的hello函式前面有個route()裝飾器,route()裝飾器裡面放的參數為斜線( / ),這表示hello函式應該被載入到url位址為斜線(/)的位置,也就是根目錄下面。

@app.route('/')def hello():    return 'Hello World!'

如果希望hello函式被載入到其他的url位址,可以修改route()裝飾器裡面放的參數。假設,我們想要讓hello函式被載入到hello的url位址中,可以改寫上面的程式碼為:

@app.route('/hello')def hello():    return 'Hello World!'

測試看看,是否有所變化。

接著加上if判斷式,並且當條件成立時,執行app.run():

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

if __name__ == ‘__main__’的敘述表示,當模組被直接啟動時,才會執行下面的程式。也就是說,當模組被直接啟動時,才會執行app.run()。

最後,我們把上面的程式碼儲存在一個副檔名為py的檔案中(例如:hello.py)。並且執行這個檔案。

$ python hello.py

執行檔案後,打開瀏覽器輸入網址(http://127.0.0.1:5000),127.0.0.1是本機位址,預設是處在偵錯模式。看看是不是出現 Hello World !了。

完整的Hello World程式碼如下:

from flask import Flaskapp = Flask(__name__)@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()

建立route

完成了Hello World的網站程式測試後的您,應該不會滿足於現狀,躍躍欲試的想要進一步增加其他的頁面吧。前面曾經提到 route() 裝飾器可以告訴Flask,緊接在裝飾器下面的函式要載入在哪個url位址中。也就是函式要載入在哪個網站路徑。如果網站的網址是「 http://127.0.0.1:5000 」的話,預設的網站路徑就是「/」,我們可以透過「 @app.route(“/”) 」來實現。換言之,如果網站的路徑是「/hello」的話,我們要透過「 @app.route(“/hello”) 」來達成。此外,緊跟在裝飾器下面的函式,其名稱可以任意指定。不過,通常我們會把「函式的名稱」與「網站路徑」取相同名稱,這樣子比較不容易出錯。

我們在這裡要利用 route() 裝飾器來設定網站的路由。我們修改上面程式碼,將原來的「/」路徑對應的函式改為home()函式,並且加上「/hello」路徑,「/hello」路徑對應hello()函式:

from flask import Flaskapp = Flask(__name__)@app.route("/")
def home():
return "This is Home Page"
@app.route("/hello")
def hello():
return "Hello World! This is Hello Page "
if __name__ == "__main__":
app.run()

按下CTRL+C 可以取消先在的執行,並且再重新啟動伺服器的執行(每次程式碼有修改,都要重新啟動伺服器)。您可以分別輸入「 http://127.0.0.1:5000 」與「 http://127.0.0.1:5000/hello 」網址,看看結果有什麼不一樣?

http://127.0.0.1:500/
http://127.0.0.1:500/hello

此外,有時候您可能會希望同一個函式可以對應兩個不同的網址,這個狀況比較常發生在首頁。您可能會希望輸入「 http://127.0.0.1:5000 」與「 http://127.0.0.1:5000/index 」網址,都會導向同樣的一個home()函式。要處理這種狀況其實很容易,只要在home()函式上方放置兩個 route() 裝飾器就可以。方法如下:

@app.route("/index")
@app.route("/")
def home():
return "This is Home Page"
http://127.0.0.1:500/index
http://127.0.0.1:500/

不只是可以放兩個,需要的時候您也可以放第三個裝飾器。

@app.route("/index")
@app.route("/home")
@app.route("/")
def home():
return "This is Home Page"

傳遞參數

目前我們還停留在靜態的階段,實際上如果是這樣子的網頁,還使用Flask來撰寫似乎有點殺雞用牛刀的感覺。實際上Flask當然不是只有這樣的能力,我們後面會慢慢的說明。我們現在試著傳遞數值或資料給網頁,讓網頁針對我們的數值或資料來進行回應。在這裡,我們要透過路由傳送參數來傳遞。

Flask預設的參數資料類型為字串(string)。傳遞的方式是經由『<』與『>』符號將資料包裹起來,傳遞給伺服器處理。

例如,我們想要傳遞名稱到首頁,上使用者一進入首頁就看到自己的名字顯示在網頁上。

這時候我們可以修改上面程式碼:

@app.route("/")
def home():
return "This is Home Page"

home()函式的部分,加上參數name。並且在return的字串中,透過 {} 放置name參數。字串f的使用方式這裡就不贅述。

def home(name):
return f"{name}, Welcome. This is Home Page"

接著,我們要修改裝飾器。我們要經由『<』與『>』符號將name包裹起來。結果如下:

@app.route("/<name>")

重新啟動伺服器,看看結果如何?

在/後面輸入sean

以上就是基本的Flask,下一回我們會來討論關於HTML模板的使用。

--

--

Sean Yeh

# Taipei, Internet Digital Advertising,透過寫作讓我們回想過去、理解現在並思考未來。並樂於分享,這才是最大贏家。