Anteriormente, perguntei Como obter dados recebidos na solicitação do Flask porque request.data
estava vazio. A resposta explicou que request.data
é o corpo da postagem não processada, mas ficará vazio se os dados do formulário forem analisados. Como posso obter o corpo da postagem bruto incondicionalmente?
@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
é o fluxo de dados brutos passados para o aplicativo pelo servidor WSGI. Nenhuma análise é feita durante a leitura, embora você geralmente queirarequest.get_data()
.O fluxo ficará vazio se tiver sido lido anteriormente por
request.data
ou por outro atributo.fonte
Criei um middleware WSGI que armazena o corpo bruto do
environ['wsgi.input']
fluxo. Salvei o valor no ambiente WSGI para poder acessá-lorequest.environ['body_copy']
no meu aplicativo.Isso não é necessário no Werkzeug ou no Flask, pois
request.get_data()
os dados brutos serão obtidos independentemente do tipo de conteúdo, mas com uma melhor manipulação do comportamento HTTP e WSGI.Isso lê o corpo inteiro na memória, o que será um problema se, por exemplo, um arquivo grande for postado. Isso não lerá nada se o
Content-Length
cabeçalho estiver ausente, portanto, não manipulará solicitações de streaming.fonte
request.data
ficará vazio serequest.headers["Content-Type"]
for reconhecido como dados do formulário, que serão analisadosrequest.form
. Para obter os dados brutos, independentemente do tipo de conteúdo, userequest.get_data()
.request.data
chamadasrequest.get_data(parse_form_data=True)
, o que resulta no comportamento diferente dos dados do formulário.fonte