サーチ…


基本ルート

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_idget_blog_postます。最初のルートが一致すると、ビュー関数に渡す値はありません。

また、デフォルトでは、変数ルールのタイプは文字列です。ただし、変数の先頭にintfloatなどのいくつかの異なる型を指定することができます。

@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コンバータを使用して任意のパスをキャッチしpathpathコンバーターは任意の文字列(スラッシュを含む)と一致します。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'


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow