HTTPルーティング
Starletteにはシンプルでありながら強力なリクエストルーティングシステムがあります。ルーティングテーブルはルーティングリストとして定義され、アプリケーションのインスタンス化時に渡されます。
Starlette. applicationからStarletteをインポート
starletteからPlainTextResponseをインポート
from starlette. routingインポートルート
async defホームページ(request):
return PlainTextResponse("ホームページ")
async def about(request):
return PlainTextResponse("About")
ルート=[
Route("/", endpoint=ホームページ),
Route("/about", endpoint=about),
]
app=Starlette(ルート=ルート)
endpoint パラメータは次のいずれかになります。
requestの単一引数を受け取り、レスポンスを返す通常の関数または非同期関数。- StarletteのHTTPEndpointのようなAS GIインタフェースを実装するクラス。
パスパラメータ
パスURIテンプレートスタイルを使用して、パスコンポーネントをキャプチャできます。
ルート('/users/{username}', user)
デフォルトでは、パスの末尾または次の / まで文字をキャプチャします。
コンバータを使用して、キャプチャしたコンテンツを変更できます。使用可能なコンバータは次のとおりです。
strデフォルトの文字列を返します。intPythonの整数を返します。floatPythonの浮動小数点数を返します。uuidはPythonのuuid.UUIDインスタンスを返します。pathは、追加の/文字を含むパスの残りの部分を返します。
変換器は、次のようにコロンを前に付けて使用します。
ルート('/users/{user_id:int}', user)
ルート('/浮動小数点/{number:float}',浮動小数点)
ルート('/up load/{rest_of_path:path}', up load)
未定義の別のコンバーターが必要な場合は、独自に作成することができます。datetime コンバーターの作成方法と登録方法の例については、以下を参照してください。
date timeからdate timeをインポート
starlette. convertorsからConvertorをインポートします。
class DateTimeConvertor(コンバーター):
regex="[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(.[
0-9]+)?
def transform t(self, value:str)->date time:
return date time. strptime(value,"%Y-%m-%dT%H:%M:%S")
def to_string(self, value:date time)->str:
return value. strftime("%Y-%m-%dT%H:%M:%S")
regiter_url_convertor("date time", DateTimeConvertor())
登録すると、次のように使用できます。
ルート('/history/{date:datetime}', history)
パスパラメータは、request.path_params ディクショナリとしてリクエストで使用できます。
async def user(request):
user_id=request. path_params['user_id']
...
HTTPメソッドの処理
ルーティングは、エンドポイントが処理するHTTPメソッドを指定することもできます。
Route('/users/{user_id:int}', user,method=["GET","POST"])
デフォルトでは、特に指定がない限り、関数エンドポイントは GET リクエストのみを受け入れます。
サブベース取り付け配線
大規模なアプリケーションでは、ルーティングテーブルの一部を一般的なパスプレフィックスに基づいて分割する場合があります。
ルート=[
ルート('/',ホームページ),
マウント('/users'、ルート=[
Route('/', users,method=['GET','POST']),
ルート('/{username}', user),
])
]
このスタイルでは、プロジェクトのさまざまな部分でルーティングテーブルのさまざまなサブセットを定義できます。
my projectからユーザーをインポートします。
ルート=[
ルート('/',ホームページ),
マウント('/users'、ルート=users. route)、
マウント('/auth'、ルート=auth。ルート)、
]
マウントを使用して、子アプリケーションをStarletteアプリケーションに含めることもできます。たとえば
これはスタンドアロンの静的ファイルサーバーです:
app=StaticFiles(ディレクトリ="static")
#これは、Starletteアプリケーション内にマウントされた静的ファイルサーバーです。
"/static"パスの下にあります。
ルート=[
...
マウント("/static", app=StaticFiles(directory="static"),name="static")
]
app=Starlette(ルート=ルート)
逆URL検索
リダイレクトレスポンスを返す必要がある場合など、特定のルートのURLを生成できるようにしたいと思うことがよくあります。
-
署名:
url_for(name, **path_params) -> URLRoute=[Route("/",ホームページ, name="home page")]
以下の内容を使用してURLを返すことができます
url=request. url for("ホーム")
URL検索にはパスパラメータを含めることができます...
ルート=[
Route("/users/{username}", user,name="user_detail")
]
#以下を使用してURLを返すことができます。。。
url=request. url_for("user_detail",username=.。。)
1つの場合 Mount 1つを含む name ベースを使用する必要があります {prefix}:{name} 逆URL検索のスタイル。
ルート=[
マウント("/users", name="users",ルート=[
Route("/", user,name="user_list"),
ルート("/{username}", user,name="user_detail")
])
]
#以下を使用してURLを返すことができます。。。
url=request. url_for("users:user_list")
url=request. url_for("users:user_detail",username=.。。)
インストールされたアプリケーションには、 path=... パラメータ。
ルート=[
...
マウント("/static", app=StaticFiles(directory="static"),name="static")
]
#以下を使用してURLを返すことができます。。。
url=request. url_for("static",path="/css/base.css")
request インスタンスがない場合は、アプリケーションの逆検索を実行できますが、これらの検索はURLパスのみを返します。
url=app. url_path_for("user_detail",username=.。。)
ホストベースのルーティング
Host ヘッダーに基づいて同じパスに異なるルートを使用する場合。
一致すると Host ヘッダーからポートが削除されることに注意してください。たとえば、Host ヘッダーに 3600(example.org:5600,example.org)以外のポートが含まれていても含まれていなくても、Host (host='example.org:3600', ...) は処理されます。
したがって、url_for でポートを使用する必要がある場合は、そのポートを指定できます。
ホストベースのルートをアプリケーションに接続する方法はいくつかあります
site=Router()#これを設定するには、例えば.`@site.route()` を使用してください。
api=Router()#これを設定するには、例えば.`@api.route()` を使用してください。
news=Router()#これを設定するには、例えば.`@news.route()` を使用してください。
ルート=[
ホスト('api.example.org', api,name="site_api")
]
app=Starlette(ルート=ルート)
app.host('www.example.org', site,name="main_site")
news_host=ホスト('news.example.org', news)
app. router.route.append(news_host)
URLクエリには、パスパラメータと同様にホストパラメータを含めることができます
ルート=[
ホスト("{subdomain}.example.org", name="sub",app=ルータ(ルート=[
マウント("/users", name="users",ルート=[
Route("/", user,name="user_list"),
Route("/{username}", user,name="user_detail")
])
]))
]
...
url=request. url_for("sub:users:user_detail",username=.。。サブドメイン=.。。)
url=request. url_for("sub:users:user_list",subdomain=.。。)
ルーティングの優先順位
着信パスは、各 Route と順番に一致します。
着信パスと一致する複数のルートがある可能性がある場合は、一般的な状況よりも前に、より具体的なルートが表示されるように注意する必要があります。
例えば:
これをしないでください:`/users/me` は着信リクエストと一致しません。
ルート=[
ルート('/users/{username}', user),
ルート('/users/me', current_user),
]
これを行ってください:`/users/me` が最初にテストされます。
ルート=[
ルート('/users/me', current_user),
ルート('/users/{username}', user),
]
ルーターインスタンスを使用して作業します
低レベルで作業している場合は、Starlette アプリケーションを作成する代わりに、通常の Router インスタンスを使用することをお勧めします。これにより、アプリケーションルーティングのみを提供し、ミドルウェアにラップしない軽量なAS GIアプリケーションが提供されます。
app=Router(ルート=[
ルート('/',ホームページ),
マウント('/users'、ルート=[
Route('/', users,method=['GET','POST']),
ルート('/{username}', user),
])
])
WebSocketルーティング
WebSocketエンドポイントを使用する場合は、通常の Route ではなく WebSocketRoute を使用する必要があります。
パスパラメータと WebSocketRoute の逆URLルックアップは、上記のHTTPルーティングセクションにあるHTTP Route と同じように機能します。
Starlette. applicationからStarletteをインポート
from starlette. routing import WebSocketRoute
async def websocket_index(websocket):
websocketを待ちます。
websocket. send_text("こんにちは、websocket!")
websocket. close()を待つ
async def websocket_user(websocket):
name=websocket. path_params["name"]
websocketを待ちます。
websocket. send_text(f"こんにちは、{name}")を待ちます
websocket. close()を待つ
ルート=[
WebSocketRoute("/", endpoint=websocket_index),
WebSocketRoute("/{name}", endpoint=websocket_user),
]
app=Starlette(ルート=ルート)
endpoint パラメータは次のいずれかになります。
- 単一の
websocketパラメータを受け取る非同期関数。 - StarletteのWebSocketEndpointなどのAS GIインターフェイスを実装するクラス。