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üploadstr, of indien niet beschikbaarNone(Bijvoorbeeldmyimage.jpg).content_type:strmet een inhoudstype (MIME-type / mediatype), ofNoneindien niet beschikbaar (bijv.image/jpeg).file: eenSpooledTemporaryFile(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: eenHeadersobject. Meestal zal dit alleen deContent-Typeheader 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 inRequest.headers.size: Eenintvan 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 deContent-Lengthheader. Indien niet ingesteld, is hetNone.
UploadFile heeft de volgende async-methoden. Ze noemen allemaal de bijbehorende bestandsmethoden onder de motorkap (met behulp van interne SpooledTemporaryFile).
async write(data): Schrijfdata(bytes) naar een bestand.async read(size): leest desize(int) bytes van het bestand.async seek(offset): Ga naar de byte locatieoffset(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()