HTTP-routering
Starlette heeft een eenvoudig maar krachtig verzoek routing systeem. De routing tabel wordt gedefinieerd als een lijst van routes en wordt doorgegeven wanneer de toepassing wordt geïnstantieerd.
Starlette.applicaties importeren vanuit Starlette
Vanaf starlette.reacties importeren PlainTextResponse
Van starlette. routing importeren Route
Async def homepage (aanvraag):
Retourneer PlainTextResponse ("Startpagina")
Async def over (verzoek):
Retourneert PlainTextResponse ("Over")
Routes = [
Route ("/", eindpunt = startpagina),
Route ("/ about", eindpunt = about),
]
App = Starlette (routes = routes)
endpoint Parameters kunnen een van de volgende zijn:
- Een reguliere of asynchrone functie die een enkel argument van
requestaccepteert en een antwoord zou moeten retourneren. - Een klasse die ASGI-interfaces implementeert, zoals Starlette 's HTTPEndpoint.
pad parameter
Paden kunnen URI-sjabloonstijlen gebruiken om padcomponenten vast te leggen.
Route ('/ users /{username}', gebruiker)
Standaard worden hiermee tekens vastgelegd tot het einde van het pad of de volgende /.
U kunt de converter gebruiken om de vastgelegde inhoud te wijzigen. De beschikbare converters zijn:
strRetourneert een tekenreeks en is de standaardwaarde.intRetourneert een Python-geheel getal.floatRetourneert een Python-drijvende-kommagetal.uuidretourneert een Pythonuuid.UUID-instantie.pathretourneert de rest van het pad, inclusief eventuele extra/-tekens.
De converter wordt gebruikt door deze als volgt voor te fixeren met een dubbele punt:
Route ('/ users /{user_id:int}', gebruiker)
Route ('/ drijvende-komma /{number:float}', drijvende _ komma)
Route ('/ geüpload /{rest_of_path:path}', geüpload)
Als u een ongedefinieerde andere converter nodig heeft, kunt u deze zelf maken. Zie hieronder voor een voorbeeld van hoe u een datetime-converter kunt maken en hoe u deze kunt registreren:
Vanaf datetime import datetime
Vanaf starlette.convertors importeren Convertor, register _ url _ convertor
Klasse DateTimeConvertor (Convertor):
Regex = "[0-9]{4}- [0-9]{2}- [0-9]{2}T [0-9]{2}: [0-9]{2}: [0-9]{2}(. [
0-9] +)? "
Def converteren (zelf, waarde: str) - > datetime:
Geeft datetime.strptime terug (waarde, "% Y-% m-% dT% H:% M:% S")
Def naar _ string (zelf, waarde: datetime) - > str:
Retourwaarde. Strftime ("% Y-% m-% dT% H:% M:% S")
register _ url _ convertor ("datetime", DateTimeConvertor ())
Na registratie kunt u het gebruiken als:
Route ('/ geschiedenis /{date:datetime}', geschiedenis)
De padparameter is beschikbaar in het verzoek als een request.path_params-woordenboek.
Async def gebruiker (verzoek):
user _ id = aanvraag. path _ params ['user _ id']
...
Omgaan met HTTP-methoden
Routing kan ook specificeren welke HTTP-methoden het eindpunt verwerkt.
Route ('/ users /{user_id:int}', gebruiker, methoden = ["GET", "POST"])
Standaard accepteren functie-eindpunten alleen GET-verzoeken, tenzij anders aangegeven.
Onderbouw bedrading
In grote toepassingen kunt u merken dat u delen van de routeringstabel wilt splitsen op basis van algemene padvoorvoegsels.
Routes = [
Route ('/', startpagina),
Mount ('/ gebruikers', routes = [
Route ('/', gebruikers, methoden = ['GET', 'POST']),
Route ('/{username}', gebruiker),
])
]
Met deze stijl kunt u verschillende subsets van routeringstabellen in verschillende delen van het project definiëren.
Van myproject import gebruikers, auth
Routes = [
Route ('/', startpagina),
Mount ('/ users', routes = gebruikersroutes),
Mount ('/ auth', routes = auth.routes),
]
U kunt mounts ook gebruiken om onderliggende toepassingen in uw Starlette-toepassing op te nemen. Bijvoorbeeld...
# Dit is een standalone statische bestandsserver:
App = StaticFiles (directory = "statisch")
# Dit is een statische bestandsserver die is aangekoppeld in een Starlette-applicatie,
# onder het "/ static" pad.
Routes = [
...
Mount ("/ static", app = StaticFiles (directory = "static"), naam = "static")
]
App = Starlette (routes = routes)
URL-zoekopdracht omkeren
U wilt meestal URL 's kunnen genereren voor specifieke routes, zoals in situaties waarin u een omleidingsreactie moet retourneren.
-
Handtekening:
url_for(name, **path_params) -> URLRoutes = [Route ("/", startpagina, naam = "startpagina")]
We kunnen het volgende gebruiken om een URL te retourneren...
Url = aanvraag.url _ voor ("Home")
URL-opzoeking kan padparameters bevatten...
Routes = [
Route ("/ gebruikers /{username}", gebruiker, naam =" user _ detail ")
]
# We kunnen het volgende gebruiken om een URL te retourneren...
Url = aanvraag. url _ for ("user _ detail", gebruikersnaam =...)
Als een Mount een name bevat, moet de basis de {prefix}:{name}-stijl gebruiken voor het omgekeerd opzoeken van URL 's.
Routes = [
Mount ("/ users", naam = "users", routes = [
Route ("/", user, name = "user _ list"),
Route ("/{username}", gebruiker, naam = "user _ detail")
])
]
# We kunnen het volgende gebruiken om URL 's te retourneren...
Url = requ.url _ for ("gebruikers: gebruiker _ lijst")
Url = requ.url _ for ("gebruikers: user _ detail", gebruikersnaam =...)
De geïnstalleerde applicatie kan een path=...-parameter bevatten.
Routes = [
...
Mount ("/ static", app = StaticFiles (directory = "static"), naam = "static")
]
# We kunnen het volgende gebruiken om URL 's te retourneren...
Url = requ.url _ for ("statisch", pad = "/ css / base.css")
Als er geen request-instantie is, kunt u een reverse lookup uitvoeren tegen de applicatie, hoewel deze lookups alleen het URL-pad retourneren.
Url = app.url _ path _ for ("user _ detail", gebruikersnaam =...)
host-gebaseerde routing
Als u verschillende routes voor hetzelfde pad wilt gebruiken op basis van de Host-header.
Merk op dat poorten uit de Host-header worden verwijderd wanneer ze overeenkomen.Host (host='example.org:3600', ...) wordt bijvoorbeeld afgehandeld, zelfs als de Host-header andere poorten dan 3600(example.org:5600,example.org) bevat of niet.
Als u daarom een poort in url_for moet gebruiken, kunt u die poort specificeren.
Er zijn verschillende manieren om hostgebaseerde routing aan uw applicatie te koppelen
Site = Router () # Gebruik eg.`@site.route()` om dit te configureren.
API = Router () # Gebruik eg.`@api.route()` om dit te configureren.
News = Router () # Gebruik eg.`@news.route()` om dit te configureren.
Routes = [
Host ('api.example.org', api, name = "site _ api")
]
App = Starlette (routes = routes)
app.host ('www.example.org', site, name = "main _ site")
news _ host = Host ('news.example.org', nieuws)
App.router.routes.append (nieuws _ host)
URL-query 's kunnen hostparameters bevatten, net als padparameters
Routes = [
Host ("{subdomain}. example.org", name = "sub", app = Router (routes = [
Mount ("/ users", naam = "users", routes = [
Route ("/", user, name = "user _ list"),
Route ("/{username}", gebruiker, naam = "user _ detail")
])
]))
]
...
Url = requ.url _ for ("sub: users: user _ detail", gebruikersnaam =..., subdomein =...)
Url = requ.url _ for ("sub: users: user _ list", subdomain =...)
route voorrang
De inkomende paden worden sequentieel vergeleken met elke Route.
In situaties waarin meerdere routes mogelijk overeenkomen met het inkomende pad, moet u ervoor zorgen dat er meer specifieke routes worden vermeld vóór het algemene geval.
Bijvoorbeeld:
# Doe dit niet:`/users/me` zal nooit overeenkomen met inkomende verzoeken.
Routes = [
Route ('/ users /{username}', gebruiker),
Route ('/ users / me', huidige _ gebruiker),
]
# Doe dit:`/users/me` wordt eerst getest.
Routes = [
Route ('/ users / me', huidige _ gebruiker),
Route ('/ users /{username}', gebruiker),
]
Werken met een routerinstantie
Als u op een laag niveau werkt, wilt u misschien een normale Router-instantie gebruiken in plaats van een Starlette-applicatie te maken. Dit geeft u een lichtgewicht ASGI-applicatie die alleen applicatierouting biedt zonder deze in een middleware te wikkelen.
App = Router (routes = [
Route ('/', startpagina),
Mount ('/ gebruikers', routes = [
Route ('/', gebruikers, methoden = ['GET', 'POST']),
Route ('/{username}', gebruiker),
])
])
WebSocket routing
Wanneer u een WebSocket-eindpunt gebruikt, moet u WebSocketRoute gebruiken in plaats van de gebruikelijke Route.
Pad parameters en WebSocketRoute De reverse URL lookup werkt met HTTP. Route Evenzo is dit te vinden in het HTTP-routeringsgedeelte hierboven.
Starlette.applicaties importeren vanuit Starlette
Van starlette. routing importeren WebSocketRoute
Async voor websocket _ index (websocket):
Wacht op websocket.accepteer ()
Wacht op websocket. send _ text ("Hallo, websocket!")
Wacht op websocket.close ()
Async def websocket _ user (websocket):
Naam = websocket. pad _ params ["naam"]
Wacht op websocket.accepteer ()
Wacht op websocket send _ text (f "Hallo,{name}")
Wacht op websocket.close ()
Routes = [
WebSocketRoute ("/", eindpunt = websocket _ index),
WebSocketRoute ("/{name}", eindpunt = websocket _ user),
]
App = Starlette (routes = routes)
endpoint Parameters kunnen een van de volgende zijn:
- Een asynchrone functie die een enkele
websocket-parameter accepteert. - Een klasse die ASGI-interfaces implementeert, zoals Starlette 's WebSocketEndpoint.