Ga naar inhoud

Requests

Starlette bevat een Request-klasse die u een gebruiksvriendelijkere interface biedt om inkomende verzoeken af te handelen in plaats van rechtstreeks toegang te krijgen tot ASGI-scopes en kanalen te ontvangen.

aanvraag

Handtekening: Request(scope, receive=None)

Van starlette. aanvragen import aanvragen
Reacties van starlette. import


Async def app (bereik, ontvangen, verzenden):
    Toepassingsgebied ['type'] = = 'http'
    Verzoek = Verzoek (scope, ontvangen)
    Inhoud = '% s% s'% (aanvraag.methode, aanvraag.url.pad)
    Reactie = Reactie (inhoud, media _ type = 'tekst / gewoon')
    In afwachting van reactie (scope, ontvangen, verzenden)

Verzoeken bieden een kaartinterface, zodat u ze kunt gebruiken zoals u zou doen met scope.

request['path'] retourneert bijvoorbeeld het ASGI-pad.

Als u geen toegang tot de verzoekinstantie nodig heeft, kunt u het verzoek instantiëren zonder parameters aan receive op te geven.

werkwijze

De aanvraagmethode wordt geopend als request.method.

Uniform Resource Locators (ook wel URL 's genoemd)

De gevraagde URL wordt geopend als request.url.

Deze eigenschap is een stringachtig object dat alle componenten weergeeft die vanuit de URL kunnen worden geparseerd.

Bijvoorbeeld:request.url.path,request.url.port,request.url.scheme.

titel

Kopteksten worden weergegeven als onveranderlijke, hoofdletterongevoelige multi-woordenboeken.

Bijvoorbeeld: request.headers['content-type']

query parameters

De queryparameters worden weergegeven als onveranderlijke meerdere woordenboeken.

Bijvoorbeeld: request.query_params['search']

pad parameter

De routerpadparameters worden weergegeven als een woordenboekinterface.

Bijvoorbeeld: request.path_params['username']

Adres van de klant

Het externe adres van de client wordt weergegeven als een binair bestand met de naam request.client(of None).

De hostnaam of IP-adres: request.client.host

Het poortnummer waarmee de client verbinding maakt: request.client.port

Koekjes

Cookies worden weergegeven in de vorm van een reguliere woordenboekinterface.

Bijvoorbeeld: request.cookies.get('mycookie')

In het geval van ongeldige cookies worden cookies genegeerd. (RFC2109)

lichaam

Er zijn verschillende interfaces voor het retourneren van de hoofdtekst van het verzoek:

De aanvraaginstantie is in bytevorm: await request.body()

Verzoekinstantie, geparseerd als formuliergegevens of meerdere delen: async with request.form() as form:

Verzoekinstantie, geparseerd als JSON: await request.json()

U kunt ook toegang krijgen tot de aanvraagtekst als een stream met behulp van de async for-syntaxis:

Van starlette. aanvragen import aanvragen
Reacties van starlette. import


Async def app (bereik, ontvangen, verzenden):
    Toepassingsgebied ['type'] = = 'http'
    Verzoek = Verzoek (scope, ontvangen)
    Lichaam = b '
    Async voor brok in request.stream ():
        Lichaam + = brok
    Reactie = Reactie (body, media _ type = 'text / plain')
    In afwachting van reactie (scope, ontvangen, verzenden)

Als u toegang krijgt tot .stream(), worden byte-brokken geleverd zonder dat het hele lichaam in het geheugen wordt opgeslagen. Elke volgende aanroep naar .body(),.form() of .json() zal een fout veroorzaken.

In sommige gevallen, zoals lange polling of streaming reacties, moet u mogelijk bepalen of de clientzijde is losgekoppeld. U kunt disconnected = await request.is_disconnected() gebruiken om deze status te bepalen.

Bestand aanvragen

Aanvraagbestanden worden meestal verzonden als meerdelige formuliergegevens (multipart/form-data).

Handtekening: request.form(max_files=1000, max_fields=1000)

U kunt het maximum aantal velden of bestanden instellen met de parameters max_files en max_fields:

Async met aanvraagformulier (max _ files = 1000, max _ fields = 1000):
    ...

!!! -informatie, die deze limieten om veiligheidsredenen instelt, staat een onbeperkt aantal velden of bestanden toe die kunnen resulteren in Distributed Denial-of-service, omdat het ontleden van te veel lege velden veel CPU en geheugen kan verbruiken.

Wanneer u async with request.form() as form aanroept, ontvangt u een starlette.datastructures.FormData, een onveranderlijk multi-woordenboek met bestandsuploads en tekstinvoer. Bestandsuploaditems worden weergegeven als instanties van starlette.datastructures.UploadFile.

UploadFile Heeft de volgende eigenschappen:

  • filename : met de originele bestandsnaam geüpload str , of indien niet beschikbaar None (Bijvoorbeeld myimage.jpg ).
  • content_type:str met een inhoudstype (MIME-type / mediatype), of None indien niet beschikbaar (bijv.image/jpeg).
  • file: een SpooledTemporaryFile(een bestandsachtig object). Dit is het eigenlijke Python bestand dat je direct kunt doorgeven aan andere functies of bibliotheken die een "bestandsachtig" object verwachten.
  • headers: een Headers object. Meestal zal dit alleen de Content-Type header zijn, maar als er andere headers in een multipart veld worden opgenomen, zullen deze hier ook worden opgenomen. Merk op dat deze headers niet gerelateerd zijn aan de headers in Request.headers.
  • size: Een int van de grootte van het geüploade bestand in bytes. Deze waarde wordt berekend op basis van de inhoud van het verzoek en is dus een betere keuze voor het bepalen van de grootte van het geüploade bestand dan de Content-Length header. Indien niet ingesteld, is het None.

UploadFile heeft de volgende async-methoden. Ze noemen allemaal de bijbehorende bestandsmethoden onder de motorkap (met behulp van interne SpooledTemporaryFile).

  • async write(data): Schrijf data(bytes) naar een bestand.
  • async read(size): leest de size(int) bytes van het bestand.
  • async seek(offset): Ga naar de byte locatie offset(int) in het bestand.
    • await myfile.seek(0) gaat bijvoorbeeld naar het begin van het bestand.
  • async close() : Sluit het bestand.

Aangezien al deze methoden async-methoden zijn, moet u erop "wachten".

U kunt bijvoorbeeld de bestandsnaam en inhoud verkrijgen door:

Async met aanvraagformulier () als formulier:
    Bestandsnaam = formulier ["upload _ bestand"] .bestandsnaam
    Inhoud = afwachten formulier ["upload _ bestand"] .read ()

!!! -informatie, zoals gespecificeerd in RFC-7578: 4.2, de sectie met formuliergegevens die het bestand bevat, gaat ervan uit dat er name- en filename-velden zijn in de Content-Disposition-header:Content-Disposition: form-data; name="user"; filename="somefile". Hoewel het filename-veld optioneel is volgens RFC-7578, helpt het Starlette te onderscheiden welke gegevens als een bestand moeten worden beschouwd. Als er een filename-veld is opgegeven, wordt een UploadFile-object gemaakt om toegang te krijgen tot het onderliggende bestand, anders wordt het formuliergegevensgedeelte geparseerd en beschikbaar gemaakt als een onbewerkte tekenreeks.

toepassing

De startende Starlette-applicatie is toegankelijk via request.app.

staat

Als u aanvullende informatie over het verzoek wilt opslaan, kunt u hiervoor request.state gebruiken.

Bijvoorbeeld:

request.state.time_started = time.time()