著者:飯尾 淳
本連載では「Pythonを昔から使っているものの、それほど使いこなしてはいない」という筆者が、いろいろな日常業務をPythonで処理することで、立派な「蛇使い」に育つことを目指します。その過程を温
かく見守ってください。皆さんと共に勉強していきましょう。第7回は、Pythonで実装されたWebアプリケーションフレームワーク「Flask」の使い方と、Pythonのユニークな文法である「デコレータ」について紹介します。
シェルスクリプトマガジン Vol.77は以下のリンク先でご購入できます。
図5 ルーティングのサンプルWebアプリケーションのコード
1 2 3 4 5 6 7 8 |
from flask import Flask app = Flask(__name__) @app.route('/hello') def hello_flask(): return '<h1>Hello, Flask!</h1>' @app.route('/goodbye') def goodbye_flask(): return '<h1>Good bye, Flask!</h1>' |
図7 簡単なメッセージを表示するプログラム
1 2 3 4 5 6 7 8 9 10 11 |
#!/usr/bin/env python def hello(): print('Hello, World') def goodbye(): print('Goodbye, World') def main(): hello() goodbye() if __name__ == '__main__': main() |
図9 デコレータを追加したプログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/usr/bin/env python def deco(func): def decorator(): print('-- start --') func() print('-- end --') return decorator @deco def hello(): print('Hello, World') @deco def goodbye(): print('Goodbye, World') def main(): hello() goodbye() if __name__ == '__main__': main() |
図11 Flaskのルーティング設定処理を模したプログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#!/usr/bin/env python class Flask(): def __init__(self): self.url_map = {} print(f'url_map on init: {self.url_map}') def add_url_rule(self, rule, func): self.url_map[rule] = func def route(self, rule): def decorator(f): self.add_url_rule(rule, f) return f return decorator def dispatch_request(self, rule): return self.url_map[rule]() app = Flask() print(f'url_map after create: {app.url_map}') @app.route('/index') def index(): print("hello world") print(f'url_map after function def: {app.url_map}') app.dispatch_request('/index') |
図13 図9のプログラムを修正した「greeting_deco2.py」
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/usr/bin/env python def deco(rule): def decorator(func): print(f'rule = \'{rule}\', func = {func}') return func return decorator @deco('/hello') def hello(): print('Hello, World') @deco('/goodbye') def goodbye(): print('Goodbye, World') |
図15 デコレータを使わないように修正した「greeting_deco3.py」
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/usr/bin/env python def deco(rule): def decorator(func): print(f'rule = \'{rule}\', func = {func}') return func return decorator def hello(): print('Hello, World') hello = deco('/hello')(hello) def goodbye(): print('Goodbye, World') goodbye = deco('/goodbye')(goodbye) |
図16 関数の挙動を変えるデコレータの使用例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#!/usr/bin/env python def plus_n(n): def decorator(func): def func_modified(*args, **kwargs): return (func(*args, **kwargs) + n) return func_modified return decorator @plus_n(3) def square(x): return x*x def main(): print(square(2)) if __name__ == '__main__': main() |
図17 関数に複数のデコレータを適用したプログラム「greeting_deco4.py」
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/usr/bin/env python def DECO(func): def decorator(): print('-- START --') func() print('-- END --') return decorator def deco(func): def decorator(): print('-- start --') func() print('-- end --') return decorator @DECO @deco def hello(): print('Hello, World') def main(): hello() if __name__ == '__main__': main() |