見出し画像

FlaskでササっとWebアプリケーション作成 〜基礎編①

1. Flaskを手を動かして学ぶ

今回から、PythonベースのWebアプリケーション作成のフレームワークであるFlaskです。

僕はプログラミング学習の初期に学ぼうと思いましたが、当時はクライアントサーバシステムやら3層スキーマやら、いわゆるWebアプリケーションの知識が全くなかったのと、Pythonも駆け出しレベルだったので断念しました。

Djangoと比べてどれくらい簡易にできるのか、その辺を手を動かしながら学びたいと思いますし、興味があったらお付き合いいただければと思います。

2.仮想環境作成とFlaskのインストール

まずは、Flaskのドキュメントを見てインストールの仕方を確認します。

(1)ドキュメントを確認してみる

ざっくりいうと、関連する必要なパッケージたちはFlaskをインストールしようとすると一緒にインストールされるということのようです。

アプリとサーバ間のインターフェースや、Webページ表示のためのテンプレート言語、セキュリティ関連のツールなどのようです。

以下の配付ツール(distributions)はFlaskをインストールするとき、自動的にインストールされます。

Werkzeugは、アプリケーションとサーバの間のインタフェースにおけるPythonでのインタフェースの標準である、WSGIを実装しています。

Jinjaは、アプリケーションが提供するページの表示(render)をする、テンプレート言語です。

MarkupSafeは、Jinjaと一緒にインストールされます。MarkupSafeはテンプレートを表示(render)するときに挿入(injection)攻撃を回避するために、信用できない入力をエスケープします。

ItsDangerousは、インテグリティを確保するために安全にデータへ署名を施します。これはFlaskのセッションのクッキーを保護するために使用されます。

Clickは、コマンドラインのアプリケーションを書くフレームワークです。flaskコマンドを提供し、独自に作成した管理コマンドを追加できるようにします。

オプションの依存対象
以下の配布ツール(distributions)は、自動的にはインストールされません。もしインストールされていたときは、Flaskが見つけ出して使用します。
Blinkerは、合図(Signals)のサポートを提供します。
python-dotenvは、flaskコマンドを実行するときdotenvからの環境変数読み込みサポートを有効にします。
Watchdogは、より高速な、より効率的な再読み込み機能(reloader)を開発サーバへ提供します。

https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/installation.html より

(2)仮想環境を作成する

上記ページはvenvを利用とあるのですが、私はM1 Macでminiforgeを利用しているのでcondaコマンドで諸々やります。

※Anacondaを何も考えずに入れてしまうと、後々後悔することもあるので自分はこうしました。

conda create -n flask_test python=3.8

先ほどのFlaskのドキュメントに、Pythonのバージョン3.7以降はサポートされていると記載があったので、なんとなく3.8で行こうと思います。

conda activate flask_test
conda install flask

作成したflask_testという仮想環境をアクティブにして、flaskをインストールします。

Channels:
 - conda-forge
Platform: osx-arm64
Collecting package metadata (repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: /opt/homebrew/Caskroom/miniforge/base/envs/flask_test

  added / updated specs:
    - flask


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    blinker-1.7.0              |     pyhd8ed1ab_0          17 KB  conda-forge
    flask-3.0.2                |     pyhd8ed1ab_0          79 KB  conda-forge
    itsdangerous-2.1.2         |     pyhd8ed1ab_0          16 KB  conda-forge
    markupsafe-2.1.5           |   py38h336bac9_0          23 KB  conda-forge
    python_abi-3.8             |           4_cp38           6 KB  conda-forge
    werkzeug-3.0.1             |     pyhd8ed1ab_0         236 KB  conda-forge
    ------------------------------------------------------------
                                           Total:         378 KB

The following NEW packages will be INSTALLED:

  blinker            conda-forge/noarch::blinker-1.7.0-pyhd8ed1ab_0 
  click              conda-forge/noarch::click-8.1.7-unix_pyh707e725_0 
  flask              conda-forge/noarch::flask-3.0.2-pyhd8ed1ab_0 
  importlib-metadata conda-forge/noarch::importlib-metadata-7.0.2-pyha770c72_0 
  itsdangerous       conda-forge/noarch::itsdangerous-2.1.2-pyhd8ed1ab_0 
  jinja2             conda-forge/noarch::jinja2-3.1.3-pyhd8ed1ab_0 
  markupsafe         conda-forge/osx-arm64::markupsafe-2.1.5-py38h336bac9_0 
  python_abi         conda-forge/osx-arm64::python_abi-3.8-4_cp38 
  werkzeug           conda-forge/noarch::werkzeug-3.0.1-pyhd8ed1ab_0 
  zipp               conda-forge/noarch::zipp-3.17.0-pyhd8ed1ab_0 


Proceed ([y]/n)? y


Downloading and Extracting Packages:
                                                                                
Preparing transaction: done                                                     
Verifying transaction: done                                                     
Executing transaction: done                      

必要な諸々がインストールできました。

3.いざクイックスタート

こういう時はまず動かしてみるのが一番です。
「これからやってくぞ!」という景気づけと、ざっくりどういう仕組みなのかな?という勉強にもなりますので。

早速やってみましょう。

(1)コードを書いてみる

まずは「hello.py」というファイルを作成します。どこにファイルを作ったかは覚えておいてください。

hello.py

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"

ドキュメントの解説を見ると、、、

最初に、Flaskクラスをimportしています。このクラスのインスタンスはWSGI(訳注: Pythonで標準化されている、WebアプリとWebサーバ間のインタフェース)アプリケーションになります。
次に、Flaskクラスのインスタンスを作成します。最初の引数はアプリケーションのモジュール(訳注: 簡単に言うと拡張子pyのPythonファイル)またはパッケージ(訳注: 簡単に言うとモジュールをまとめて格納したディレクトリ)の名前です。__name__はモジュールまたはパッケージの名前用に殆どの場合で適切な便利なショートカットです。これはテンプレート、静的ファイルなどのリソースを探す場所をFlaskが知るために必要になります。
それからroute()デコレータを使って、どのURLが関数の引き金になるべきかをFlaskに伝えます。
その関数はユーザのブラウザで表示したいメッセージを返します。標準のコンテント・タイプはHTMLなので、HTML文字列はブラウザによって変換表示されます。

これをhello.pyもしくは似たようなものに保存します。Flask自身と衝突するため、自分のアプリケーションはflask.pyとは名付けないように必ずしてください。

アプリケーションを実行するには、flaskコマンドまたはpython -m flaskを使用します。--app(訳注: 原文では「-app」ですが、多分誤記)を使用して、自分のアプリケーションがどこにあるかをFlaskへ伝える必要があります。To run the application, use the ``flask`

https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/quickstart.html より

ざっくりいうと、Flaskというクラスのインスタンスを作成して、用意したhello.pyを保有するアプリケーションをルートアドレスで実行させてるって感じだと思います。

WebページへHTMLでHello, World!と表示をさせるという簡単な機能です。

(2)作成したファイルをFlaskで実行してみよう

では、次にこのhello.pyを実行させるには、コマンドラインで以下のように実行します。

flask --app hello run

正常に実行されると、以下のようにコマンドラインに表示されます。

 * Serving Flask app 'hello'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit

「http://127.0.0.1:5000 で動いてるよ、止めたい時はCTRLキーとCを一緒に押してね」ということです。

(3)本当に動いているのか確認してみよう

ではWebブラウザを起動して、上記URLをアドレス欄に入力して確認してみましょう。


Webブラウザ(ローカルホスト)で確かに実行されています。

4.確かに簡単だ!!そして早い!

Djangoは、単純にこれだけのテンプレートを表示するためにもProjectを作成して、データベース項目を定義して、、、とそれなりの手数がかかることを考えると簡単ですね!!

次回はさらにドキュメントを読み進めてみたいと思います。

この記事が気に入ったらサポートをしてみませんか?