HTTP-Route
Starlette verfügt über ein einfaches, aber leistungsfähiges Anfrage-Routing-System, in dem Routing-Tabellen als Routing-Listen definiert sind und bei der Instanziierung von Anwendungen übergeben werden.
von starlette. applications import Starlette
from starlette. responses import plainTextResponse (englisch)
von starlette. routing import Route
async def Homepage (Anforderung):
return PlainTextResponse ("Homepage") Bearbeiten
async def about (Anforderung):
return plainTextResponse ("About")(Übersetzung)
Die Bahn […]
Route ("/", endpoint = homepage) und
Route ("/about", endpoint = about) und
]
Starlette (Routen = Routen) Bearbeiten
endpoint Der Parameter kann einer der folgenden sein:
- Eine normale oder asynchrone Funktion, die ein einzelnes
request-Argument akzeptiert und eine Antwort zurückgeben sollte. - Eine Klasse, die das ASGI-Interface implementiert, z. B. Starlettes HTTPENdpoint.
Straßenparameter.
Pfade können URI-Vorlagenformate verwenden, um Pfadkomponenten zu erfassen.
Route ('/Benutzer/{username}', Benutzer)
Standardmäßig werden dadurch Zeichen bis zum Ende des Pfades oder bis zum nächsten / erfasst.
Sie können den Konverter verwenden, um die erfassten Inhalte zu ändern, indem Sie die verfügbaren Konverter auf:
strGibt einen String zurück und ist der Standardwert.intGibt eine ganze Python-Zahl zurück.floatGibt eine Python Fließkommazahl zurück.uuidZurück zu Pythonuuid.UUIDBeispiele.pathgibt den Rest des Pfades zurück, einschließlich zusätzlicher/-Zeichen.
Der Konverter wird wie folgt verwendet, indem ein Doppelpunkt vor ihm angehängt wird:
Route ('/users/{user_id:int}', Benutzer)
Route ('/floating-point/{number:float}', floating_point) oder Route ('/floating-point/{number:float}', floating_point)
Route ('/uploaded/{rest_of_path:path}', uploaded) Bearbeiten
Wenn Sie einen anderen undefinierten Konverter benötigen, können Sie Ihren eigenen erstellen, indem Sie das folgende Beispiel zum Erstellen eines datetime-Konverters und zum Registrieren dieses Konverters sehen:
von datetime Import datetime
from starlette. convertors import convertor, register_url_convertor [Bearbeiten | Quelltext bearbeiten]
class DateTimeConvertor (Konverter):
[0 - 9]{4}-[0 - 9]{2}-[0 - 9]{2}T [0 - 9]{2}: [0 - 9]{2}: [0 - 9]{2}(.[0 - 9]+)?
def convert (self, value: str)-> datetime: def convert (self, value: str)-> datetime:
return datetime. strptime (value," %Y- % m- % dT %H: %M: %S")
def zu_string (self, value: datetime)-> str:
return wert. strftime (" %Y- % m- % dT %H: %M: %S")
register_url_convertor ("datetime", DateTimeConverter ())("Dateikonvertierung")
Nach der Registrierung können Sie es als verwenden:
Route ('/Geschichte/{date:datetime}', Geschichte)
Pfadparameter sind in der Anfrage als request.path_params-Wörterbuch verfügbar.
async def Benutzer (Anforderung):
user_id = request. path_params 'Benutzer_id']
...
Umgang mit HTTP-Methoden
Routing kann auch angeben, welche HTTP-Methoden Endpunkte verarbeiten:
Route ('/users/{user_id:int}', user, methods =["GET","POST"])
Standardmäßig akzeptiert der Funktionsendpunkt nur GET-Anforderungen, sofern nicht anders angegeben.
Untergeschoss mit Kabel installieren
In großen Anwendungen stellen Sie möglicherweise fest, dass Sie einen Teil der Routingtabelle basierend auf einem gemeinsamen Pfadpräfix aufteilen möchten.
Die Bahn […]
Route ('/', Webseite),
mount ('/users', routes =[Bearbeiten | Quelltext bearbeiten]
Route ('/', Benutzer, Methoden =' GET ',' POST']),
Route ('/{username}', Benutzer),
])
]
Dieser Stil ermöglicht es Ihnen, verschiedene Teilmengen von Routing-Tabellen in verschiedenen Teilen Ihres Projekts zu definieren.
von myproject import users, auth
Die Bahn […]
Route ('/', Webseite),
mount ('/users', routes = users. routes), oder
Mount ('/auth', routes = auth. routes), oder
]
Sie können auch Unteranwendungen einhängen, um sie in Ihre Starlette-Anwendung wie z. B.…aufzunehmen.
#Dies ist ein statischer Dateiserver.
app = StaticFiles (Verzeichnis ="static")
#Dies ist ein statischer Dateiserver, der in einer Starlette-Anwendung eingebettet ist.
Unterschätzen Sie die "/static"-path.
Die Bahn […]
...
mount ("/static", app = StaticFiles (directory ="static"), name ="static")(Verzeichnis ="static")
]
Starlette (Routen = Routen) Bearbeiten
Umgekehrte URL durchsuchen
Häufig möchten Sie in der Lage sein, eine URL für eine bestimmte Route zu generieren, z. B. wenn Sie eine Umleitungsantwort zurückgeben müssen.
-
Unterschrift:
url_for(name, **path_params) -> URLroutes =[Route ("/", Startseite, name ="homepage")]
Mit folgendem Befehl können Sie eine URL zurückgeben:
url = request. url_for ("Startseite")
URL-Lookup kann Pfadparameter enthalten……
Die Bahn […]
Route ("/users/{username}", Benutzer, name ="user_detail")
]
##Wir können die folgenden verwenden, um eine URL zurückzugeben.
url = request. url_for ("Benutzer_details", Benutzername =...)
Wenn ein Mount ein name enthält, sollte das Dock den {prefix}:{name}-Stil für umgekehrte URL-Lookups verwenden.
Die Bahn […]
mount ("/users", name ="Benutzer", routes =[]
Route ("/", Benutzer, name ="Benutzer_Liste"),
Die Route (>{username}", user, name =" Benutzer_details ")
])
]
##Wir können die URL zurücksetzen.
url = request. url_for ("Benutzer: Benutzerliste")
url = request. url_for ("Benutzer: Benutzer_Details", Benutzername =...)
Die installierte Anwendung kann einen path=...-Parameter enthalten.
Die Bahn […]
...
mount ("/static", app = StaticFiles (directory ="static"), name ="static")(Verzeichnis ="static")
]
##Wir können die URL zurücksetzen.
url = request. url_for ("statisch"; Pfad ="/css/base.css")
Wenn keine Instanz von request vorhanden ist, können Sie eine Umkehrsuche für Ihre Anwendung durchführen, die jedoch nur einen URL-Pfad zurückgibt.
url = app. url_path_for ("Benutzerdetails", Benutzername =...)
Auf dem Weg zum Hauptgerät.
Wenn Sie eine andere Route für denselben Pfad verwenden möchten, basierend auf dem Host-Header.
Bitte beachten Sie, dass bei der Anpassung Host Entfernen Sie beispielsweise Ports aus dem Header, auch wenn Host Der Kopf enthält oder nicht. 3600 ( example.org:5600 , example.org außerhalb der Tore, Host (host='example.org:3600', ...) Sie werden auch behandelt, wenn Sie es tun. url_for Wenn ein Port benötigt wird, kann dieser Port angegeben werden.
Es gibt mehrere Möglichkeiten, das hostbasierte Routing mit Ihrer Anwendung zu verbinden.
site = Router () # Verwenden Sie eg .`@site.route()`, um dies zu konfigurieren .
api = Router () # Verwenden Sie eg .`@api.route()`, um dies zu konfigurieren .
Router () # Verwenden Sie eg .`@news.route()`, um dies zu konfigurieren .
Die Bahn [ … ]
Host ('api.example.org', api , name = " site _ api ")
]
Starlette (Routen = Routen) Bearbeiten
app.host('www.example.org' , site , name = " main _ site " (Hauptseite)
news _ host = Host ('news.example.org', Nachrichten)
append . router . routes . append (Nachrichten _ host)
URL-Abfragen können Host-Parameter enthalten , genau wie Pfadparameter .
Die Bahn [ … ]
Der Host ("{subdomain}.example.org" , name = " sub " , app = Router (routes = [ Router ] = [ Netzwerk-Router ])
mount ("/users " , name = " Benutzer " , routes = [ ]
Route ("/" , Benutzer , name = " Benutzer _ Liste ") ,
Route ("/{username}" , Benutzer , Name = " user _ detail ")
])
]))
]
...
url = request . url _ for (" sub : users : user _ detail " , username = ... , subdomain = ...)
url = request . url _ for (" sub : users : user _ list " , Subdomain = ...) (für alle Benutzer)
Route priorisiert .
Der eingehende Pfad wird mit jedem Route in der Reihenfolge abgeglichen .
In Fällen , in denen mehrere Routen mit einem eingehenden Pfad übereinstimmen , sollten Sie sicherstellen , dass spezifischere Routen vor der allgemeinen Situation aufgeführt sind .
Beispielsweise :
# Don't do this :`/users/me` wird nie mit Anfragen übereinstimmen .
Die Bahn [ … ]
Route ('/users/{username}', Benutzer) ,
Route ('/users/me', aktuelle _ user) ,
]
Do this:`/users/me` wurde zuerst getestet.
Die Bahn […]
Route ('/users/me', aktuelle_user),
Route ('/users/{username}', user), oder
]
Verwenden von Routerbeispielen zum Arbeiten
Wenn Sie auf niedriger Ebene arbeiten, möchten Sie möglicherweise eine normale Router-Instanz verwenden, anstatt eine Starlette-Anwendung zu erstellen, die Ihnen eine leichte ASGI-Anwendung bietet, die nur Anwendungsrouting bietet, ohne sie in eine Middleware zu packen.
Router = Router (Router = Router)
Route ('/', Webseite),
mount ('/users', routes =[Bearbeiten | Quelltext bearbeiten]
Route ('/', Benutzer, Methoden =' GET ',' POST']),
Route ('/{username}', Benutzer),
])
])
WebSocket unterwegs
Wenn Sie mit WebSocket-Endpunkten arbeiten, sollten Sie WebSocketRoute anstelle des üblichen Route verwenden.
Die Pfadparameter und Reverse-URL-Lookups für WebSocketRoute funktionieren genauso wie HTTP Route, die im Abschnitt HTTP-Routing oben zu finden sind.
von starlette. applications import Starlette
von starlette. routing import WebSocketRoute
async def websocket_index (websocket)(für Websocket):
Websocket aufrufen. accept ()
await websocket. send_text ("Hallo, websocket!")("Hallo, websocket!")
Websocket erstellen. close ()
async def websocket_user (websocket) für Websocket
name = websocket. path_params ["name"]["name"] ["name"] und ["name"]
Websocket aufrufen. accept ()
await websocket. send_text (f "Hallo,{name}")(Übersetzung)
Websocket erstellen. close ()
Die Bahn […]
WebSocketRoute ("/", endpoint = websocket_index) oder
WebSocketRoute ("/{name}", endpoint = websocket_user),
]
Starlette (Routen = Routen) Bearbeiten
endpoint Der Parameter kann einer der folgenden sein:
- ist eine asynchrone Funktion, die ein einzelnes
websocket-Argument akzeptiert. - Eine Klasse, die das ASGI-Interface implementiert, z. B. Starlettes WebSocketEndpoint.