Flask
ルーティング
サーチ…
基本ルート
Flaskのroute
は、Flaskアプリケーションインスタンスのroute
デコレータを使用して定義できます。
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello Flask'
route
デコレータは、一致するURLである文字列を受け取ります。この文字列に一致するURLの要求がアプリケーションによって受信されると、装飾された機能( ビュー機能とも呼ばれる)が呼び出されます。だから私たちが持っているルートについては、
@app.route('/about')
def about():
return 'About page'
これらのルートは、Djangoのような正規表現ではないことに注意することが重要です。
変数ルールを定義して、URLセグメント値を変数に抽出することもできます。
@app.route('/blog/posts/<post_id>')
def get_blog_post(post_id):
# look up the blog post with id post_id
# return some kind of HTML
ここで変数ルールはURLの最後のセグメントにあります。 URLの最後のセグメントにある値は、 post_id
パラメータとしてビュー関数( get_blog_post
)にpost_id
ます。したがって、 /blog/posts/42
へのリクエストは、42のidを持つブログ投稿を検索(または検索しようとします)します。
URLを再利用することも一般的です。たとえば、 /blog/posts
にすべてのブログ投稿のリストを返すことができます。したがって、同じビュー機能に対して2つのルートを持つことができます。
@app.route('/blog/posts')
@app.route('/blog/posts/<post_id>')
def get_blog_post(post_id=None):
# get the post or list of posts
ここで、 post_id
には、デフォルト値のNone
を指定するpost_id
がget_blog_post
ます。最初のルートが一致すると、ビュー関数に渡す値はありません。
また、デフォルトでは、変数ルールのタイプは文字列です。ただし、変数の先頭にint
やfloat
などのいくつかの異なる型を指定することができます。
@app.route('/blog/post/<int:post_id>')
FlaskのビルトインURLコンバータは次のとおりです。
string | Accepts any text without a slash (the default).
int | Accepts integers.
float | Like int but for floating point values.
path | Like string but accepts slashes.
any | Matches one of the items provided
uuid | Accepts UUID strings
最後のURLセグメントの値を整数に変換できないURL /blog/post/foo
にアクセスしようとすると、アプリケーションは404エラーを返します。 /blog/post
と最後のセグメントに文字列を含むルールがないため、これは正しいアクションです。
最後に、HTTPメソッドも受け入れるようにルートを設定できます。 route
デコレータは、このルートの許容HTTPメソッドを表す文字列のリストであるmethods
キーワード引数を受け取ります。仮定したように、デフォルトはGET
のみです。新しいブログ投稿を追加するフォームがあり、 GET
リクエストのHTMLを返してPOST
リクエストのフォームデータを解析したければ、ルートは次のようになります。
@app.route('/blog/new', methods=['GET', 'POST'])
def new_post():
if request.method == 'GET':
# return the form
elif request.method == 'POST':
# get the data from the form values
このrequest
は、 flask
パッケージに記載されています。 methods
キーワード引数を使用する場合は、受け入れるHTTPメソッドについて明示的に指定する必要があります。 POST
だけを列挙した場合、ルートはGET
リクエストに応答しなくなり、405エラーが返されます。
キャッチオールルート
パスに基づいて複雑なロジックを処理する場合、1つのキャッチオールビューを持つと便利です。この例では、次の2つのルールを使用します。最初のルールは/
をキャッチし、2番目のルールは組み込みのpath
コンバータを使用して任意のパスをキャッチしpath
。 path
コンバーターは任意の文字列(スラッシュを含む)と一致します。Flask Variable-Rules
@app.route('/', defaults={'u_path': ''})
@app.route('/<path:u_path>')
def catch_all(u_path):
print(repr(u_path))
...
c = app.test_client()
c.get('/') # u_path = ''
c.get('/hello') # u_path = 'hello'
c.get('/hello/stack/overflow/') # u_path = 'hello/stack/overflow/'
ルーティングとHTTPメソッド
デフォルトでは、経路はGET
要求にのみ応答します。 methods
引数をroute()
デコレータに指定することで、この動作を変更できます。
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
do_the_login()
else:
show_the_login_form()
使用されるHTTPメソッドに基づいて、同じエンドポイントに異なる機能をマップすることもできます。
@app.route('/endpoint', methods=['GET'])
def get_endpoint():
#respond to GET requests for '/endpoint'
@app.route('/endpoint', methods=['POST', 'PUT', 'DELETE'])
def post_or_put():
#respond to POST, PUT, or DELETE requests for '/endpoint'