Zum Inhalt

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:str mit dem ursprünglichen Namen der hochgeladenen Datei oder None, wenn nicht verfügbar (z. B.myimage.jpg).
  • content_type:str mit einem Inhaltstyp (MIME-Typ/Medientyp) oder None, wenn es nicht verfügbar ist (z.B.image/jpeg).
  • file : einen SpooledTemporaryFile (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: Ein Headers-Objekt Normalerweise wäre dies nur ein Content-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 in Request.headers zu tun haben.
  • size ·eine Größe in einer Einheit von Dateien int Dieser 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-Length Wenn der Kopf nicht gesetzt ist, ist er None 。

UploadFile hat die folgenden async-methoden, die alle die entsprechende dateimethode auf der unterseite aufrufen (mit internem SpooledTemporaryFile).

  • async write(data): schreibt data(bytes) in die Datei.
  • async read(size): liest die size-Bytes (int) der Dateien.
  • async seek(offset) ·Umzug zum Ort des Dokuments offset ( int (Ort.
    • Zum Beispiel wird await myfile.seek(0) an den Startort der Datei gehen.
  • 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()