ルーティング#
Quartでは、複数の複雑なルートを定義でき、クライアントは要求されたメソッドとパスに応じて特定のコードをトリガーできます。
最も単純なルーティングは、次のような単純な静的ルールです。
@app.route('/')
async def index():
...
@app.route('/about')
async def about():
...
これは、ほとんど静的なWebサイトには十分なことがよくあります。
動的ルーティング#
動的ルーティングは、ルートの一部が事前定義ではなくマッチングされることを指定する<変数>マーカーを使用することで実現できます。たとえば、
@app.route('/page/<page_no>')
async def page(page_no):
...
は、/page/1、/page/2、および/page/jeffのパスに一致し、page_no引数はそれぞれ'1'、'2'、'jeff'に設定されます。
コンバーター#
多くの場合、変数をどのように変換し、暗黙のうちにパスに一致させるかを指定することが必要かつ有用です。これは、変数名の前にコロンで区切られたコンバーター名、<converter:variable>を追加することで機能します。上記の例を適用すると、
@app.route('/page/<int:page_no>')
async def page(page_no):
...
は、/page/1および/page/2のパスに一致し、page_no引数は1および2に設定されます(型に注意してください)が、/page/jeffはjeffをintに変換できないため、一致しなくなります。
利用可能なコンバーターは次のとおりです。
|
正の浮動小数点数 |
|
正の整数 |
|
スラッシュ付きの |
|
(デフォルト)スラッシュのない任意のテキスト |
|
UUID文字列 |
追加のコンバーターは、url_map convertersディクショナリに追加できることに注意してください。
キャッチオールルート#
/<path:path>ルート定義は、他のルートと一致しないすべてのリクエストをキャッチします。
デフォルト値#
変数の使用は、ユーザーにとって煩わしい場合があります。たとえば、/page/<int:page_no>は/pageと一致しないため、ユーザーは/page/1を指定する必要があります。これは、デフォルト値を指定することで解決できます。
@app.route('/page', defaults={'page_no': 1})
@app.route('/page/<int:page_no>')
async def page(page_no):
...
これにより、/pageはpage_noが1に設定されて一致できます。
ホストマッチング、ホストとサブドメイン#
アプリでホストマッチングが有効になっている場合、明示的なhostまたはsubdomainを使用してルートをアプリに追加して一致させることができます。これにより、ホストヘッダーが一致した場合にのみルートが一致するようになります。たとえば、host='quart.com'は、quart.comのホストヘッダーを持つリクエストと一致させ、それ以外の場合は404になります。
subdomainオプションは、アプリの設定SERVER_NAMEが設定されている場合にのみ使用できます。ホストは{subdomain}.{SERVER_NAME}として構築されるためです。
ホストまたはサブドメインオプションで変数コンバーターを使用できることに注意してください。
こちらも参照#
QuartはWerkzeugのルーターを使用しています