ホームページにPythonを埋め込む方法があり、pipで埋め込むのに必要なパッケージが簡単に入る。 有名なパッケージにDjango, Flask, Tornadoなどがあるが、ここではFlaskを紹介する。
大規模な開発に向いているらしい。youtubeとかもこれでできているらしい。
軽量シンプルなフレームワーク。機能としては最低限らしいが、Python自体でも色々できるのであまり気にならない。 ちなみにこのホームページの一部に埋め込んでみた。
処理速度が速いらしい。ただ日本語のサイトが少ない。
参考: Webアプリ初心者のFlaskチュートリアル 上記のサイトを参考に、以下のようなディレクトリ構造で作成している。
<Webアプリの名前>
|- app
| |- static
| | |- css #スタイルシート用
| | |- images #画像用
| |
| |- templates #webアプリで読み込まれるhtml
| | |- <Webアプリのhtmlファイル>
| |
| |- <Webアプリ本体のpythonファイル>
|
|- <最初に読み込まれるpythonファイル>
Webアプリは上に書いたように、pythonファイルだけではなくhtml/cssが必要。 止まったページをhtml/cssで作って、pythonで動きをつけるイメージ。
よく例としてwebに"Hello World!"を表示させるだけのものが紹介されているが、それだけだと面白くないので少しだけ動きのあるものを作ってみる。 まずはディレクトリを構成する。
test_app
|- app
| |- static #今回はなし
| |
| |- templates
| | |- index.html
| |
| |- app.py
|
|- test.py
のように作った。
次に、test.py, app.py, index.htmlを書いていく。
#!/usr/local/bin/python3.10
# -*- coding: utf-8 -*-
from app.app import app
if __name__ == "__main__":
app.run()
最初の行の#!/usr/local/bin/python3.10
のように実行するpythonのパスを書いておくと、通常ターミナルからpython3 test.py
とするところを、./test.py
で実行できる。
次の行の# -*- coding: utf-8 -*-
は文字コードを指定して、文字化けを防止するため。
4行目でappディレクトリにあるapp.pyをimportして、webアプリの実体(app.py)をここから実行できるようにする。
if __name__ == "__main__":
はc, c++でいうmainクラスのような役割で、最初に呼ばれる場所にできる。
最後のapp.run()
でwebアプリを起動。
次にページのレイアウトを作る。
<!DOCTYPE html>
<html>
<head>
<title>test app</title>
</head>
<body>
<h1>Webアプリのテスト</h1>
<a href="/one">test1</a><br>
<a href="/two">test2</a>
</body>
</html>
"test1"のリンクを踏むと<アプリのアドレス> /oneに、"test2"では.../twoに飛ばされるようにした。 アプリのアドレスは環境によって違うが、単純にターミナルでtest.pyを実行したときはhttp://127.0.0.1:5000
最後に、処理部分を書いていく。
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/")
@app.route("/index")
def index():
return render_template("index.html")
@app.route("/one")
def one():
return "pushed_test1"
@app.route("/two")
def two():
return "pushed_test2"
if __name__ == "__main__":
app.run(debug=True)
app = Flask(__name__)
ではwebアプリの実体を作っている。
@app.route("")
ではアクセスするアドレスで処理を分けている。
例えば@app.route("/")
では<アプリのアドレス>/にアクセスしたときにすぐ下の関数を実行し、
@app.route("/one")
では<アプリのアドレス>/oneにアクセスしたときに下のdef one():
をここから実行する。
render_template("")
でtemplatesディレクトリ内のhtmlファイルを指定することで、この関数が呼ばれたときにそのhtmlページを表示できる。
整理すると、ターミナルで./test.pyを実行→<アプリのアドレス>にアクセス→def index():
の処理→
index.htmlの表示→”test1”のリンクを踏む→<アプリのアドレス>/oneにアクセス→def one():
を実行
というように処理される。