Auparavant, j'ai demandé comment obtenir les données reçues dans la demande Flask car elle request.data
était vide. La réponse a expliqué qu'il request.data
s'agit du corps brut de l'article, mais qu'il sera vide si les données du formulaire sont analysées. Comment puis-je obtenir le corps du courrier brut sans condition?
@app.route('/', methods=['POST'])
def parse_request():
data = request.data # empty in some cases
# always need raw data here, not parsed form data
request.stream
est le flux de données brutes transmis à l'application par le serveur WSGI. Aucune analyse n'est effectuée lors de sa lecture, bien que vous souhaitiez généralement larequest.get_data()
remplacer.Le flux sera vide s'il a été précédemment lu par
request.data
ou par un autre attribut.la source
J'ai créé un middleware WSGI qui stocke le corps brut du
environ['wsgi.input']
flux. J'ai enregistré la valeur dans l'environnement WSGI afin de pouvoir y accéder depuisrequest.environ['body_copy']
mon application.Cela n'est pas nécessaire dans Werkzeug ou Flask, car cela
request.get_data()
permettra d'obtenir les données brutes quel que soit le type de contenu, mais avec une meilleure gestion du comportement HTTP et WSGI.Cela lit le corps entier en mémoire, ce qui sera un problème si, par exemple, un fichier volumineux est publié. Cela ne lit rien si l'en-
Content-Length
tête est manquant, donc il ne traitera pas les demandes de streaming.la source
request.data
sera vide sirequest.headers["Content-Type"]
est reconnu comme des données de formulaire, qui seront analyséesrequest.form
. Pour obtenir les données brutes quel que soit le type de contenu, utilisezrequest.get_data()
.request.data
appelsrequest.get_data(parse_form_data=True)
, ce qui entraîne un comportement différent pour les données de formulaire.la source