Acessando dados POST de WSGI
-
22-08-2019 - |
Pergunta
Eu não consigo descobrir como acessar dados POST usando WSGI. Eu tentei o exemplo no site da wsgi.org e não funcionou. Eu estou usando Python 3.0 agora. Por favor, não recomendo um quadro WSGI como isso não é o que eu estou procurando.
Eu gostaria de descobrir como obtê-lo em um objeto FieldStorage.
Solução
Assumindo que você está tentando obter apenas os dados POST em um objeto FieldStorage:
# env is the environment handed to you by the WSGI server.
# I am removing the query string from the env before passing it to the
# FieldStorage so we only have POST data in there.
post_env = env.copy()
post_env['QUERY_STRING'] = ''
post = cgi.FieldStorage(
fp=env['wsgi.input'],
environ=post_env,
keep_blank_values=True
)
Outras dicas
body= '' # b'' for consistency on Python 3.0
try:
length= int(environ.get('CONTENT_LENGTH', '0'))
except ValueError:
length= 0
if length!=0:
body= environ['wsgi.input'].read(length)
Note que WSGI ainda não está totalmente especificada para Python 3.0, e grande parte da infra-estrutura WSGI popular não foi convertido (ou foi 2to3d, mas não devidamente testado). (Mesmo wsgiref.simple_server não será executado.) Você está em um momento difícil fazer WSGI em 3.0 hoje.
Isso funcionou para mim (em Python 3.0):
import urllib.parse
post_input = urllib.parse.parse_qs(environ['wsgi.input'].readline().decode(),True)
Mesmo mais curto
l = int(env.get('CONTENT_LENGTH')) if env.get('CONTENT_LENGTH') else 0
body = env['wsgi.input'].read(l) if l > 0 else ''
Esse código funciona em produção.
eu sugiro que você olhar como algumas estruturas de fazê-lo para um exemplo. (Eu não estou recomendando qualquer único, apenas usá-los como um exemplo.)
Aqui está o código de Werkzeug :
http://dev.pocoo.org/projects /werkzeug/browser/werkzeug/wrappers.py#L150
que chamadas
http://dev.pocoo.org/projects /werkzeug/browser/werkzeug/utils.py#L1420
É um pouco complicado para resumir aqui, então eu não vou.