前回 は、参考書を見ながら、nginx の理解を進めました。
今回は、Flask という Python用の軽量な Webアプリケーションフレームワークを使ってみます。
Flask は、Werkzeug という WSGI に準拠した Webアプリケーションライブラリと、Jinja2 というテンプレートエンジンを使っています。
それでは、やっていきます。
はじめに
「セキュリティ」の記事一覧です。良かったら参考にしてください。
・第2回:Ghidraで始めるリバースエンジニアリング(使い方編)
・第3回:VirtualBoxにParrotOS(OVA)をインストールする
・第4回:tcpdumpを理解して出力を正しく見れるようにする
・第5回:nginx(エンジンエックス)を理解する
・第6回:Python+Flask(WSGI+Werkzeug+Jinja2)を動かしてみる ← 今回
今回は、Python で作る WSGI準拠の Webアプリケーションライブラリの Werkzeug を使って、いろいろやってみたいと思います。
Flask の公式ドキュメントの日本語訳のページです。
msiz07-flask-docs-ja.readthedocs.io
Werkzeug の公式サイトは以下です。
開発環境は、VirtualBox + ParrotOS 6.1 です。
Pythonの環境構築
久しぶりの Python です。
公式サイトのインストールのページに従って、まずは、venv で今回の環境を作ります。
$ python -m venv 20240728_wsgi $ . 20240728_wsgi/bin/activate
WSGIをwsgirefで動かしてみる
まず、WSGI(Web Server Gateway Interface)について、理解していきます。
以下のウィキペディアを読みます。なるほど、任意の Webサーバを動かすために、Webアプリケーションとのインタフェースを定義したんですね。
Python標準ライブラリの Webサーバ wsgiref で動かしてみます。
インストールしなくても標準ライブラリなので、すぐに動きます。
Python公式サイトの wsgiref のページは以下です。
すぐに動かせるソースがあるので、やってみます。
以下のソースを、demo_app.py として保存します。
wsgiref の simple_server が使われています。テスト用でしょうか。
make_server メソッドの引数が、サーバの設定です。第1引数はホストアドレスで、省略してるので、localhost だと思います。第2引数はポート番号で 8000番です。第3引数は、WSGIアプリケーションを設定します。通常は自分で実装するところですが、そこも demo_app というのが用意されています。
from wsgiref.simple_server import make_server, demo_app with make_server('', 8000, demo_app) as httpd: print("Serving HTTP on port 8000...") # Respond to requests until process is killed httpd.serve_forever() # Alternative: serve one request, then exit httpd.handle_request()
早速動かしてみます。
$ python demo_app.py
Serving HTTP on port 8000...
サーバが起動したようなので、ブラウザでアクセスしてみます。
「Hello world!」と、その後に、環境変数が表示されてそうです。WSGI の引数に環境変数があるので、それを表示しているということでしょうか。

demo_app の実装は以下のようです。
ちょっと読みにくいソースですが、HTTPレスポンスヘッダをセットして、ボディには、全ての環境変数を出力した内容をセットしてるようです。
def demo_app(environ,start_response): from io import StringIO stdout = StringIO() print("Hello world!", file=stdout) print(file=stdout) h = sorted(environ.items()) for k,v in h: print(k,'=',repr(v), file=stdout) start_response("200 OK", [('Content-Type','text/plain; charset=utf-8')]) return [stdout.getvalue().encode("utf-8")]
Werkzeugを動かしてみる
続いて、Werkzeug で動かしてみます。
Werkzeug をインストールします。
$ pip install Werkzeug
Werkzeug の公式サイトのチュートリアルの先頭に書かれてるコードを動かしてみます。
2行目と、applicationメソッド以外は、先ほど動かしたコードと同じです。
from wsgiref.simple_server import make_server from werkzeug.wrappers import Response def application(environ, start_response): response = Response('Hello World!', mimetype='text/plain') return response(environ, start_response) with make_server('', 8000, application) as httpd: print("Serving HTTP on port 8000...") # Respond to requests until process is killed httpd.serve_forever() # Alternative: serve one request, then exit httpd.handle_request()
早速動かしてみます。
$ python sample.py
Serving HTTP on port 8000...
サーバが起動したようなので、ブラウザでアクセスしてみます。
ちゃんと Hello World! が表示されました。

Flaskでチュートリアルを動かしてみる
まずは、Flask をインストールして、Flask の公式サイトのチュートリアルをやってみたいと思います。
Flaskのインストール
$ pip install flask Successfully installed Jinja2-3.1.4 MarkupSafe-2.1.5 Werkzeug-3.0.3 blinker-1.8.2 click-8.1.7 flask-3.0.3 itsdangerous-2.2.0
Flask をインストールすると、Jinja2、Werkzeug も一緒にインストールされました。
Flaskの公式ドキュメントのチュートリアルを動かしてみる
Flask の公式ドキュメントのチュートリアルには、丁寧な説明とともに、ソースコードが書かれています。
これを hello.py というファイルを作り、エディタで開いて、コピペして保存します。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
では、早速動かしてみます。
$ 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
Flask が内蔵している簡易的な Webサーバが起動したようです。指示通り、http://127.0.0.1:5000 にブラウザでアクセスしてみます。

Flask を実行した端末で、Ctrl+C を教えてサーバを終了します。
おわりに
今回は、WSGI、Werkzeug、Flask の順に簡単な動作をさせてみました。
次回は、Flask についてもう少し深堀していきたいと思います。
最後になりましたが、エンジニアグループのランキングに参加中です。
気楽にポチッとよろしくお願いいたします🙇
今回は以上です!
最後までお読みいただき、ありがとうございました。