Requêtes
Starlette contient une classe Request qui vous fournit une interface plus conviviale pour traiter les demandes entrantes plutôt que d'accéder directement à la plage ASGI et aux canaux de réception.
Demande de
Signé par: Request(scope, receive=None)
de starlette.requests Demande d'importation
from starlette.responses Réponse à l'importation
async def app(scope, receive, send):
assert scope ['type'] == 'http'
demande = demande (scope, receive)
content = '%s %s' % (request.method, request.url.path)
response = Response(content, media_type ='text/plain')
Await response(scope, receive, send)
Les requêtes fournissent une interface de cartographie, de sorte que vous pouvez les utiliser comme vous le feriez avec scope.
Exemple:request['path'] renverra le chemin ASGI.
Si vous n'avez pas besoin d'accéder au corps de la requête, vous pouvez instancier la requête sans fournir de paramètres à receive.
Méthodes
La méthode de demande est accessible en request.method.
Uniform Resource Locator (également souvent appelé simplement adresse Web)
L'URL demandée est accessible en request.url.
La propriété est un objet de type chaîne qui expose tous les composants qui peuvent être analysés à partir de l'URL.
Exemples:request.url.path,request.url.port,request.url.scheme.
Le titre
Les en-têtes sont exposés comme immuables, insensibles à la casse multidictionnaire.
Par exemple: request.headers['content-type']
Query paramètres
Les paramètres de requête sont exposés comme des dictionnaires multiples immuables.
Par exemple: request.query_params['search']
Paramètres de chemin
Les paramètres de chemin de routeur sont exposés comme une interface de dictionnaire.
Par exemple: request.path_params['username']
Adresse client
L'adresse distante du client est exposée comme un groupe binaire appelé request.client(ou None).
Ce nom d'hôte ou adresse IP: request.client.host
Numéro de port auquel le client est connecté: request.client.port
Les Cookies
Les cookies sont présentés sous la forme d'une interface de dictionnaire conventionnelle.
Par exemple: request.cookies.get('mycookie')
Dans le cas de cookies invalides, les cookies sont ignorés (RFC2109).
Le corps
Il existe plusieurs interfaces différentes pour retourner le corps de la demande:
Le corps de la requête est sous forme d'octets: await request.body()
Corps de la demande, résolu en données de formulaire ou en plusieurs parties: async with request.form() as form:
Le corps de la requête, résolu en JSON: await request.json()
Vous pouvez également utiliser la syntaxe async for pour accéder au corps de la requête en tant que flux:
de starlette.requests Demande d'importation
from starlette.responses Réponse à l'importation
async def app(scope, receive, send):
assert scope ['type'] == 'http'
demande = demande (scope, receive)
corps = b''
async for chunk sur request.stream ():
corps += chunk
response = Response(body, media_type ='text/plain')
Await Response(scope, receive, send)
Si vous accédez à .stream(), le bloc d'octets est fourni sans que le corps entier soit stocké en mémoire. tout appel ultérieur à .body(),.form() ou .json() générera une erreur.
Dans certains cas, comme un long sondage ou une réponse de flux, vous devrez peut-être déterminer si le client est déconnecté. vous pouvez utiliser disconnected = await request.is_disconnected() pour déterminer cet état.
Demande de documents
Les fichiers de requête sont généralement envoyés sous forme de données de formulaire multiparties (multipart/form-data).
Signé par: request.form(max_files=1000, max_fields=1000)
Vous pouvez configurer le nombre maximum de champs ou de fichiers avec les paramètres max_files et max_fields:
async avec request.form(max_files=1000, max_fields=1000):
...
Les informations!!! fixent ces limites pour des raisons de sécurité, et autoriser un nombre illimité de champs ou de fichiers peut entraîner une attaque par déni de service, car l'analyse de trop de champs vides consomme beaucoup de CPU et de mémoire.
Lorsque vous appelez async with request.form() as form Lorsque vous recevez un starlette.datastructures.FormData , qui est un dictionnaire multiple immuable contenant les téléchargements de fichiers et les entrées de texte. starlette.datastructures.UploadFile instances de.
UploadFile possède les propriétés suivantes:
filename:stravec le nom du fichier original téléchargé, ouNones'il n'est pas disponible (myimage.jpgpar exemple).content_type: avec un type de contenu (type MIME/type média)strou si elle n'est pas disponible (par exempleimage/jpeg) est alorsNone。file: unSpooledTemporaryFile(un objet ressemblant à un fichier). Il s'agit du fichier Python réel que vous pouvez passer directement à d'autres fonctions ou bibliothèques qui attendent des objets "ressemblant à un fichier".headers: Un pourHeadersl'objet. normalement ce sera justeContent-Typeen-tête, mais si d'autres en-têtes sont inclus dans le champ multipartite, ils seront également inclus ici.Request.headersLa tête au milieu n'a rien à voir.size: unintde la taille du fichier téléchargé en octets. cette valeur est calculée en fonction du contenu de la demande et constitue donc un meilleur choix pour déterminer la taille du fichier téléchargé que l'en-têteContent-Length.Nonesi elle n'est pas définie.
UploadFile possède les méthodes async suivantes. elles appellent toutes les méthodes de fichier correspondantes sous la couche inférieure (en utilisant un SpooledTemporaryFile interne).
async write(data): écritdata(bytes) dans un fichier.async read(size): lit les octetssize(int) du fichier.async seek(offset): Aller à la position des octets dans le fichieroffset(int) à l'endroit.- Par exemple,
await myfile.seek(0)va au début du fichier.
- Par exemple,
async close(): Fermez le fichier.
Puisque toutes ces méthodes sont des méthodes async, vous devez les « attendre ».
Par exemple, vous pouvez obtenir le nom et le contenu du fichier de la manière suivante:
async avec request.form() comme forme:
filename = form["upload_file"].filename
contents = await form["upload_file"].read()
Les informations!!! telles que spécifiées dans la RFC - 7578: 4.2, la partie contenu des données du formulaire contenant le fichier suppose qu 'il y a des champs name et filename dans l'en-tête Content-Disposition:Content-Disposition: form-data; name="user"; filename="somefile" Bien que le champ filename soit facultatif selon la RFC - 7578, il aide Starlette à distinguer quelles données doivent être considérées comme des fichiers. Si un champ filename est fourni, un objet UploadFile sera créé pour accéder au fichier sous-jacent, sinon la partie des données du formulaire sera analysée et disponible en tant que chaîne brute.
Applications pour
L'application Starlette de départ est accessible via request.app.
état de
Si vous souhaitez stocker des informations supplémentaires sur votre demande, vous pouvez le faire en utilisant request.state.
Par exemple:
request.state.time_started = time.time()