PythonのウェブフレームワークであるFlaskを学ぶ。

Flaskは、Pythonのウェブフレームワークです。

  • 和英 : (flǽsk)〔実験で使う〕フラスコ〔ウイスキーなどの〕フラスコ瓶

https://a2c.bitbucket.io/flask/_images/logo-full.png
Flaskへ ようこそ — Flask v0.5.1 documentation

Flaskは、Bottleと同じくらい簡単に使えるが、Facebook認証やデータベース統合など、本格的なウェブ開発で役に立つ様々な拡張を備えている。
https://www.oreilly.co.jp/books/images/picture978-4-87311-738-6.gif

ウェブフレームワークは、クライアントからの要求とサーバの応答を処理してくれます。

https://camo.qiitausercontent.com/709d8bdb4a5bb2d9223cc468e21f2dcbcb2cfb19/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f36353331322f63303638613462632d643964372d373363662d353332352d3166346536616538333536632e706e67
Python Webフレームワーク Django vs Pyramid vs Flask 2015年12月 - Qiita

WSGIライブラリのwerkzeugとjinja2が入っています。

WSGIとは、PythonでのWebサーバとWebアプリケーションをつなぐインターフェースを定義した仕様です。

WSGIJavaにおけるJava Servelet APIと同じように,WebサーバとWebアプリケーション間の汎用的なインターフェースを定義しています。WSGIを利用することで,WebサーバとWebアプリケーションの実装を切り離すことができ,WebサーバとWebアプリケーションフレームワークの組み合わせを柔軟に選択することができるようになりました。
gihyo.jp

f:id:ponsuke_tarou:20190108201858p:plain
5. WSGIとPylons - Emerge Technology

https://c-bata.link/webframework-in-python/_images/router.png
ルーティング — c-bata.link

本を見ながら実際にFlaskを使ってみます。

  • 環境
    • macOS Mojave バージョン10.14.2
    • Python 3.6.5
    • pip 18.1

https://www.oreilly.co.jp/books/images/picture978-4-87311-738-6.gif

Flaskをインストールします。

# インストールします。
$ pip3 install flask
Collecting flask
  Downloading https://files.pythonhosted.org/packages/7f/e7/08578774ed4536d3242b14dacb4696386634607af824ea997202cd0edb4b/Flask-1.0.2-py2.py3-none-any.whl (91kB)
    100% |████████████████████████████████| 92kB 701kB/s 
Collecting click>=5.1 (from flask)
  Downloading https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl (81kB)
    100% |████████████████████████████████| 81kB 2.3MB/s 
Collecting Jinja2>=2.10 (from flask)
  Downloading https://files.pythonhosted.org/packages/7f/ff/ae64bacdfc95f27a016a7bed8e8686763ba4d277a78ca76f32659220a731/Jinja2-2.10-py2.py3-none-any.whl (126kB)
    100% |████████████████████████████████| 133kB 1.3MB/s 
Collecting Werkzeug>=0.14 (from flask)
  Downloading https://files.pythonhosted.org/packages/20/c4/12e3e56473e52375aa29c4764e70d1b8f3efa6682bef8d0aae04fe335243/Werkzeug-0.14.1-py2.py3-none-any.whl (322kB)
    100% |████████████████████████████████| 327kB 2.2MB/s 
Collecting itsdangerous>=0.24 (from flask)
  Downloading https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl
Collecting MarkupSafe>=0.23 (from Jinja2>=2.10->flask)
  Downloading https://files.pythonhosted.org/packages/da/fc/2979c425ad23d528d6ac2e1f3efdc28e572fa1e1fbd5a75171cbdd7ddaa5/MarkupSafe-1.1.0-cp36-cp36m-macosx_10_6_intel.whl
Installing collected packages: click, MarkupSafe, Jinja2, Werkzeug, itsdangerous, flask
Successfully installed Jinja2-2.10 MarkupSafe-1.1.0 Werkzeug-0.14.1 click-7.0 flask-1.0.2 itsdangerous-1.1.0

# バージョン確認します。
$ flask --version
Flask 1.0.2
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 03:03:55) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
$ pip3 -V
pip 18.1 from /Users/mana/Dropbox/ApacheDcumentRoot/Slack-Python-Onboarding-Tutorial/tryFlask/lib/python3.6/site-packages/pip (python 3.6)

リクエストの入口にする try_flask.py を作ります。

ホーム画面用の index.html を作ります。


jinja2を体験してみます。

jinja2は、Python用のテンプレートエンジンです。

f:id:ponsuke_tarou:20190109223501p:plain
Welcome to Jinja2 — Jinja2 Documentation (2.10)

テンプレートのHTMLを作ります。
# templatesディレクトリを作成して、
$ mkdir templates
# その中にHTMLを作ります。
$ echo -n > templates/jinja2.html

動かしてみます。

$ python3 try_flask.py 
 * Serving Flask app "try_flask" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:8080/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 256-786-415
127.0.0.1 - - [09/Jan/2019 23:23:34] "GET /echo/ponsuke_tarou HTTP/1.1" 200 -
127.0.0.1 - - [09/Jan/2019 23:24:45] "GET /echo?name=ponsuke_tarou&do=%27write%20HatenaBlog%27 HTTP/1.1" 301 -
127.0.0.1 - - [09/Jan/2019 23:24:45] "GET /echo/?name=ponsuke_tarou&do=%27write%20HatenaBlog%27 HTTP/1.1" 200 -
127.0.0.1 - - [09/Jan/2019 23:34:24] "GET /echo/?name=ponsuke_tarou&do=HatenaBlog%E3%82%92%E6%9B%B8%E3%81%84%E3%81%A6 HTTP/1.1" 200 -
 * Detected change in '/path/to/try_flask.py', reloading
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 256-786-415

f:id:ponsuke_tarou:20190109221733p:plain
http://localhost:8080/にアクセスするとホーム画面が表示されました。
f:id:ponsuke_tarou:20190109222336p:plain
http://localhost:8080/echo/ponsuke_tarouにアクセスると引数の「ponsuke_tarou」がちゃんとハマった文字列が返されました。
f:id:ponsuke_tarou:20190109233513p:plain
http://localhost:8080/echo/?name=ponsuke_tarou&do=HatenaBlogを書いて にアクセスするとGETで渡した引数がテンプレートにハマって表示されました。