2019年11月28日 星期四

夠Python,神奇修飾器的語法糖


本篇文章將介紹修飾器,在這之前我們先說明Flask網站設計。

第一次看到Python微型網站框架Flask的程式,心中就有一種感覺,為何短短6行指令就能建構出網站的框架?

1
2
3
4
5
6
7
8
from flask import Flask, escape, request

app = Flask(__name__)

@app.route('/')
def hello():
    name = request.args.get("name", "World")
    return f'Hello, {escape(name)}!'

第一行程式大家都很熟悉的flask套件ask套件匯入三個元件Flask, escape, request,Flask用來建立flask的微型網站(第三行),request則是用來取得瀏覽器所送來的參數"name"(第七行),若無則預設為"world",escape則是用來處理脫逸符號(第八行),如:'<'和'>'等。

不過上面程式執行後並沒有結果,必須在加上主程式。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from flask import Flask, escape, request

app = Flask(__name__)

@app.route('/')
def hello():
    name = request.args.get("name", "World")
    return f'Hello, {escape(name)}!'

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

如上圖中的第11行,app.run(),啟動Flask物件的執行,請在命令列cmd上執行本範例。

執行127.0.0.1:500即可看到結果。
執行結果:

測試一下夾帶參數,注意在下圖網址欄中輸入參數。

查看一下命令列的訊

接下來我們來說明程式第五行
@app.route('/')
這是使用修飾器(Decorator)中的語法糖(Syntactic Sugar),就能夠把網址和想要執行函式挷定,以本範例為例,當使用者僅輸入127.0.0.1:5000時,表示要啟動首頁,這時就會呼叫hello()函式。


以下我們使用一個範例來說明修飾器的語法糖,當我們呼叫myfunc函式時,會把myfunc函式包括修飾器所指定的函式,用這種作法的好處是很容易實現框架,因為框架是先被設計出來,而網頁函式是較晚才被設計出來,如何讓以前的程式來叫未來函式,這種做法是不是很像魔法師中的魔法棒。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def decorate(func):
    def wrapper_func(*arg):
        print("執行前")
        func(*arg)
        print("執行後")
    return wrapper_func

@decorate
def myfunc(parameter):
    print(parameter)

myfunc("Hello")



執行結果:

沒有留言:

張貼留言