Requests
Starlette enthält einen Request Klasse, die Ihnen eine viel freundlichere Schnittstelle zur Verarbeitung eingehender Anfragen bietet, als den direkten Zugriff auf ASGI-Bereiche und empfangene Kanäle.
Forderung
Unterzeichnung: Request(scope, receive=None)
from starlette. requests import Request (Eingabeaufforderung)
from starlette. responses import response import response (englisch)
async def app (scope, receive, send): async def app (scope, receive, send):
assert scope 'type']='http'.
Request = Request (scope, receive)(Anforderung)
content =' % s % s'%(request. method, request. url. path)[Bearbeiten | Quelltext bearbeiten]
response = Antwort (Inhalt, Medien_Typ ='text/plain')
Erhalte Antworten (Senden, Empfangen, Senden)
Requests stellen eine Schnittstelle für die Zuordnung bereit, so dass Sie sie wie scope verwenden können.
Beispiel:request['path'] gibt den ASGI-Pfad zurück.
Wenn Sie keinen Zugriff auf den Anforderungs-Hauptteil benötigen, können Sie die Anforderung instanziieren, ohne receive einen Parameter zu übergeben.
Die Methode
Der Zugriff erfolgt über request.method.
Uniform Resource Locator (normalerweise auch einfach als Website bezeichnet)
Auf die angeforderte URL wird mit request.url zugegriffen.
Das Attribut ist ein String-ähnliches Objekt, das alle Komponenten verfügbar macht, die aus einer URL aufgelöst werden können.
Zum Beispiel: request.url.path , request.url.port , request.url.scheme 。
Überschrift
Die Header werden als unveränderliche, nicht zwischen Groß-und Kleinschreibung unterscheidende Multi-Dictionary ausgesetzt.
Zum Beispiel: request.headers['content-type']
Suchparameter
Abfrageparameter sind als unveränderliche mehrfache Wörterbücher verfügbar.
Zum Beispiel : request.query_params['search']
Straßenparameter .
Routerpfade werden als dictionary interfaces offengelegt .
Beispielsweise : request.path_params['username']
Adresse des Kunden
Die entfernten Adressen der Clients werden als binäre Gruppe namens request.client(oder None) aufgedeckt .
Name des Rechners oder die IP-Adresse : request.client.host
Portnummer , mit der der Client eine Verbindung herstellt : request.client.port
Die Cookies
Cookies werden in Form eines normalen Wörterbuchinterfaces dargestellt .
Beispielsweise : request.cookies.get('mycookie')
Cookies werden ignoriert , wenn sie ungültig sind (RFC 2109) .
Körperlich .
Es gibt verschiedene Schnittstellen , um den angeforderten Körper zurückzugeben :
Antrag in Form von : await request.body()
Anfordern des Subjekts , das in Formulardaten oder Teile aufgelöst wird : async with request.form() as form:
Der Request wird zu JSON verarbeitet : await request.json()
Sie können auch die async for-Syntax verwenden , um auf den Anforderungshauptteil als Stream zuzugreifen :
from starlette . requests import Request (Eingabeaufforderung)
from starlette . responses import response import response (englisch)
async def app (scope , receive , send) : async def app (scope , receive , send) :
assert scope ' type ' ] = ' http'.
request = Request (scope , receive) (Anforderung)
Inhalt = b ' '
Async für Chunkrequest.stream():
Inhalt += CHUNK
response = Antwort (Inhalt, Media_type ='text/plain')
Erhalte Antworten (Senden, Empfangen, Senden)
Wenn Sie auf .stream() zugreifen, wird ein Byteblock bereitgestellt, ohne dass der gesamte Hauptteil im Speicher gespeichert wird, ohne dass nachfolgende Aufrufe von .body(),.form() oder .json() einen Fehler verursachen.
In einigen Fällen, z. B. bei Long-Polling oder Streaming-Response, müssen Sie möglicherweise ermitteln, ob der Client getrennt ist, was Sie verwenden können. disconnected = await request.is_disconnected() bestimmen diesen Zustand.
Dokumente anfordern
Anfragedateien werden normalerweise als mehrteilige Formulardaten (multipart/form-data) gesendet.
Unterschrift: request.form(max_files=1000, max_fields=1000)
Sie können die maximale Anzahl von Feldern oder Dateien mit den Parametern max_files und max_fields konfigurieren:
async mit request. form (max_files = 1000, max_fields = 1000)
...
!!! -Informationen setzen diese Einschränkungen aus Sicherheitsgründen, so dass eine unbegrenzte Anzahl von Feldern oder Dateien zu einem Denial-of-Service-Angriff führen kann, da das Parsen zu vieler leerer Felder eine erhebliche Menge an CPU und Speicher verbraucht.
Wenn Sie async with request.form() as form aufrufen, erhalten Sie eine Instanz von starlette.datastructures.FormData, einem unveränderlichen Multi-Dictionary, das Datei-Uploads und Text-Input-Datei-Uploads als starlette.datastructures.UploadFile darstellt.
UploadFile Es hat folgende Eigenschaften:
filename:strmit dem ursprünglichen Namen der hochgeladenen Datei oderNone, wenn nicht verfügbar (z. B.myimage.jpg).content_type:strmit einem Inhaltstyp (MIME-Typ/Medientyp) oderNone, wenn es nicht verfügbar ist (z.B.image/jpeg).file: einenSpooledTemporaryFile(Ein dateiähnliches Objekt) Dies ist die eigentliche Python-Datei, die Sie direkt an eine andere Funktion oder Bibliothek übergeben können, von der Sie erwarten, dass sie ein "dateiähnliches" Objekt ist.headers: EinHeaders-Objekt Normalerweise wäre dies nur einContent-Type-Kopf, aber wenn andere Köpfe in einem mehrteiligen Feld enthalten sind, werden sie auch hier enthalten sein Beachten Sie, dass diese Köpfe nichts mit den Köpfen inRequest.headerszu tun haben.size·eine Größe in einer Einheit von DateienintDieser Wert wird basierend auf dem angeforderten Inhalt berechnet und ist daher eine bessere Wahl, um die Größe der hochgeladenen Datei zu bestimmen, anstatt sie zu berechnen.Content-LengthWenn der Kopf nicht gesetzt ist, ist erNone。
UploadFile hat die folgenden async-methoden, die alle die entsprechende dateimethode auf der unterseite aufrufen (mit internem SpooledTemporaryFile).
async write(data): schreibtdata(bytes) in die Datei.async read(size): liest diesize-Bytes (int) der Dateien.async seek(offset)·Umzug zum Ort des Dokumentsoffset(int(Ort.- Zum Beispiel wird
await myfile.seek(0)an den Startort der Datei gehen.
- Zum Beispiel wird
async close()·Schließung der Unterlagen.
Da es sich bei all diesen Methoden um async-Methoden handelt, müssen Sie auf sie "warten".
Sie können beispielsweise den Dateinamen und den Inhalt auf folgende Weise erhalten:
async mit der request. form () als form:
filename = Form ["upload_file"]. filename
contents = await form ["upload_file"]. read ()[Bearbeiten | Quelltext bearbeiten]
!!! Informationen gemäß RFC-7578: 4.2, die den Inhalt eines Formulars enthalten, gehen davon aus, dass Content-Disposition Im Kopf gibt es name und filename Zeile: Content-Disposition: form-data; name="user"; filename="somefile" Gemäß RFC-7578, filename Das Feld ist optional, aber es hilft Starlette zu unterscheiden, welche Daten als Dateien betrachtet werden sollten, wenn sie zur Verfügung gestellt werden. filename Das Wort wird erschaffen. UploadFile Das Objekt greift auf die zugrunde liegende Datei zu, andernfalls wird der Formulardatenteil analysiert und als Originalzeichenfolge verfügbar gemacht.
Anwendungen
Die Starlette-App ist über request.app zugänglich.
Zustand.
Wenn Sie weitere Informationen auf Ihrer Anfrage speichern möchten, können Sie es verwenden. request.state zu realisieren.
Beispielsweise:
request.state.time_started = time.time()