Zum Inhalt

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:

  • str Gibt einen String zurück und ist der Standardwert.
  • int Gibt eine ganze Python-Zahl zurück.
  • float Gibt eine Python Fließkommazahl zurück.
  • uuid Zurück zu Python uuid.UUID Beispiele.
  • path gibt 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) -> URL

    routes =[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.