環境
・windows10
・python3.8.2
・docker version 20.10.12
・linux(debian11)
・flaskフレームワーク
ルーティングについて
ユーザーからのリクエストに対して、webサーバーがどんな動きをするのかというのをルーティングと言います。
事前準備
作業を始める前に、python仮想環境を実行して、開発サーバーをデバックモードで起動しておく必要があります。
まずはpythonプロジェクトを作成したディレクトリまで移動して、そこでsource .venv/bin/activate
で仮想環境を実行します。(私の場合はroot/Flask-Project内の階層に作成しましたので、ここに移動します。)
$ cd root/python-project
$ source .venv/bin/activate
仮想環境が立ち上がったら、開発用サーバーをデバックモードで起動します。
$ export FLASK_APP=test1.py
$ export FLASK_ENV=development
$ flask run
ルーティングプログラミング
以下の記述でurlの内容によって動作を分けることができます。
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
def hello():
return 'Hello, World!'
「@app.route(‘/hello’)」から始まるブロックを増やしました。
これは、URLに「/hello」が付いていた場合、def hello_world():を実行するとルーティングを行いました。
ルート階層では、「’Index Page’」と表示するように変化しています。
このように、ユーザーがアクセスするURLによって行う処理を記述することができます。
ブラウザから、
「localhost:5000/」
「localhost:5000/hello」
の2つのURLにアクセスをしてみると、それぞれ、プログラミングした文字が表示されるはずです。
もしもpythonプロジェクト内のroot以外のフォルダに入っている場合は、cd
コマンドで該当のディレクトリまで移動して、実行してみてください。
変数
URLの部分に、<>
で囲む変数を表記することで、ユーザーから引数をもらうことができます。
この引数には、型も指定することもでき、ユーザー名別などでurlの表記を変えたいときなどに使用します。
「test1.py」のプログラムに、次のプログラムを追記してみます。
from markupsafe import escape
@app.route('/user/<username>')
def show_user_profile(username):
return 'User %s' % escape(username)
@app.route('/post/<int:post_id>')
def show_post(post_id):
return 'Post %d' % post_id
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
return 'Subpath %s' % escape(subpath)
URLで受け取った値を定義した関数の引数として利用することで、ユーザーからもらった値を処理に使うことができます。
「user/」の部分では、ULRが「/user/」のあとの文字をshow_user_profile関数の引数として受け取り、ページに表示する処理を行なっています。
escapeは入力された文字列のエスケープ処理を行い、入力された文字がクロスサイトスクリプティングなどの攻撃に結びつかないように処理をしておきます。
3つの処理を追加しましたので、それぞれ次のように入力して表示を試してみます。
localhost:5000/user/yourname
User namae
と表示されます。
localhost:5000/post/1234
Post 1234
と表示されます。
localhost:5000/post/-1
Not Found
と、404ページが表示されます。負はダメです。
localhost:5000/path/test/test1
Subpath /test/test1
と表示されます。
型の種類
string
:デフォルト、スラッシュ以外の文字
int
:正のint(整数)
float
:正のfloat型(小数)
path
:スラッシュも使える文字
uuid
:uuidの文字列