Aller au contenu

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:str avec le nom du fichier original téléchargé, ou None s'il n'est pas disponible (myimage.jpg par exemple).
  • content_type : avec un type de contenu (type MIME/type média) str ou si elle n'est pas disponible (par exemple image/jpeg ) est alors None 。
  • file: un SpooledTemporaryFile(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 pour Headers l'objet. normalement ce sera juste Content-Type en-tête, mais si d'autres en-têtes sont inclus dans le champ multipartite, ils seront également inclus ici. Request.headers La tête au milieu n'a rien à voir.
  • size: un int de 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ête Content-Length.None si 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): écrit data(bytes) dans un fichier.
  • async read(size): lit les octets size(int) du fichier.
  • async seek(offset) : Aller à la position des octets dans le fichier offset ( int ) à l'endroit.
    • Par exemple,await myfile.seek(0) va au début du fichier.
  • 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()