Como as variáveis ​​POST e GET são tratadas no Python?

135

No PHP, você pode usar apenas as variáveis $_POSTPOST e $_GETGET (string de consulta). Qual é o equivalente em Python?

Click Voto a favor
fonte
Você está escrevendo um aplicativo CGI script, mod_python ou Django (ou outra estrutura)? As dobradiças resposta em um pouco mais informação ...
Rob
você pode fornecer código de exemplo para cada um deles?
Click Upvote
2
CGI, mod_python, Django, CherryPy e Pylons não são exemplos de código. Eles são estruturas da Web Python que lidam com GET e POST. Veja wiki.python.org/moin/WebFrameworks para obter informações. Sua pergunta - conforme solicitado - não pode ser respondida.
S.Lott

Respostas:

246

suponha que você esteja postando um formulário html com este:

<input type="text" name="username">

Se estiver usando cgi bruto :

import cgi
form = cgi.FieldStorage()
print form["username"]

Se estiver usando Django , Pylons , Flask ou Pyramid :

print request.GET['username'] # for GET form method
print request.POST['username'] # for POST form method

Usando Turbogears , Cherrypy :

from cherrypy import request
print request.params['username']

Web.py :

form = web.input()
print form.username

Werkzeug :

print request.form['username']

Se estiver usando Cherrypy ou Turbogears, também é possível definir sua função de manipulador usando um parâmetro diretamente:

def index(self, username):
    print username

Google App Engine :

class SomeHandler(webapp2.RequestHandler):
    def post(self):
        name = self.request.get('username') # this will get the value from the field named username
        self.response.write(name) # this will write on the document

Então você realmente terá que escolher uma dessas estruturas.

nosklo
fonte
18
Usando import cgi, não é print form["username"].value?
J. Katzwinkel
Estou usando o Bottleque eu acredito que usa wsgi, alguém poderia postar o equivalente a usar nesse cenário? A resposta acima é a explicação mais clara que encontrei, apenas não inclui o meu cenário.
user1063287
2
O FieldStorage está quebrado no python3, você pode ter problemas com ele. bugs.python.org/issue6234
NuclearPeon
2
Permita-me esclarecer meu comentário anterior; esta página: lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode explica melhor. Não use FieldStorage () no python 3 devido a problemas de codificação.
NuclearPeon
Para Flask é um pouco diferente: request.args.get ( 'username')
Damjan Pavlica
35

Eu sei que esta é uma pergunta antiga. No entanto, é surpreendente que nenhuma boa resposta tenha sido dada.

Antes de tudo, a questão é completamente válida sem mencionar a estrutura. O CONTEXTO é uma equivalência da linguagem PHP. Embora existam muitas maneiras de obter os parâmetros da string de consulta no Python, as variáveis ​​da estrutura são apenas convenientemente preenchidas. No PHP, $_GETe $_POSTtambém são variáveis ​​de conveniência. Eles são analisados ​​de QUERY_URI e php: // input respectivamente.

No Python, essas funções seriam os.getenv('QUERY_STRING')e sys.stdin.read(). Lembre-se de importar os módulos os e sys.

Temos que ter cuidado com a palavra "CGI" aqui, especialmente ao falar sobre dois idiomas e seus pontos em comum ao fazer interface com um servidor da web. 1. CGI, como um protocolo, define o mecanismo de transporte de dados no protocolo HTTP. 2. O Python pode ser configurado para ser executado como um script CGI no Apache. 3. O módulo CGI no Python oferece algumas funções de conveniência.

Como o protocolo HTTP é independente de idioma e a extensão CGI do Apache também é independente de idioma, a obtenção dos parâmetros GET e POST deve suportar apenas diferenças de sintaxe entre os idiomas.

Aqui está a rotina Python para preencher um dicionário GET:

GET={}
args=os.getenv("QUERY_STRING").split('&')

for arg in args: 
    t=arg.split('=')
    if len(t)>1: k,v=arg.split('='); GET[k]=v

e para o POST:

POST={}
args=sys.stdin.read().split('&')

for arg in args: 
    t=arg.split('=')
    if len(t)>1: k, v=arg.split('='); POST[k]=v

Agora você pode acessar os campos da seguinte maneira:

print GET.get('user_id')
print POST.get('user_name')

Devo também salientar que o módulo CGI não funciona bem. Considere esta solicitação HTTP:

POST / test.py?user_id=6

user_name=Bob&age=30

O uso CGI.FieldStorage().getvalue('user_id')causará uma exceção de ponteiro nulo porque o módulo verifica cegamente os dados do POST, ignorando o fato de que uma solicitação POST também pode conter parâmetros GET.

Schien
fonte
Eu tenho esse erro: AttributeError: 'NoneType' object has no attribute 'split'usando CGIcom Python2,7
candlejack
1
Sobre o erro que @candlejack disse, tente obter argumentos como este POST.get('user_name', 'default_value').
George Siggouroglou 20/0318
@GeorgeSiggouroglou A coisa 'default_value' resolveu meu problema. Obrigado!
Umbe1987
1
Definitivamente minha resposta favorita até agora! 1
umbe1987
QUERY_STRING não é um índice válido no Mac
Samuel Ev
31

Eu achei a resposta do nosklo muito extensa e útil! Para aqueles que, como eu, que acham que o acesso direto aos dados brutos da solicitação também é útil, gostaria de adicionar a maneira de fazer isso:

import os, sys

# the query string, which contains the raw GET data
# (For example, for http://example.com/myscript.py?a=b&c=d&e
# this is "a=b&c=d&e")
os.getenv("QUERY_STRING")

# the raw POST data
sys.stdin.read()
Tom
fonte
Estou tentando chamar um método em um arquivo cgi. Um exemplo de URL é http://www.myserver.com/cgi-bin/cgi.py/ThisIsMyMethod. As seguintes variáveis ​​ambientais estão relacionadas: os.environ.get('PATH_INFO')que obtém o nome do método (por exemplo: / ThisIsMyMethod) e os.environ.get('SCRIPT_NAME')que fornece o caminho para o script a partir da pasta raiz do host da Web (por exemplo: /cgi-bin/cgi.py). No meu caso, QUERY_STRING está em branco, pois estou usando POST.
NuclearPeon 07/07
28

Eles são armazenados no objeto de armazenamento de campo CGI.

import cgi
form = cgi.FieldStorage()

print "The user entered %s" % form.getvalue("uservalue")
Evan Fosmark
fonte
2
-1. existem algumas representações do objeto request, dependendo das bibliotecas / estruturas usadas.
bruno desthuilliers
10
Não sei por que você fez -1. Quero dizer, o que eu dei funciona. Talvez ele seja incapaz de usar uma estrutura. Além disso, a maioria das estruturas não usa isso em segundo plano?
Evan Fosmark
4
Era estúpido para fazer -1, eu tenho um para equilibrá-lo, mais eu acho que este é o melhor método como ele retorna uma picada (que é o que é pedido)
joedborg
1
@ Liam Não sei por que você está recebendo o None, mas este post tem mais de 6 anos, então não duvido que as coisas mudaram.
Evan Fosmark
@EvanFosmark Estou recebendo Nenhum valor usando isso. Quando imprimo o valor retornado de cgi.FeildStorage, é isso que resulta em FieldStorage (None, None, []). Eu postei uma pergunta completa aqui stackoverflow.com/questions/38024516/… Qualquer ajuda será apreciada.
Chor Sipahi
1

Depende um pouco do que você usa como uma estrutura CGI, mas eles estão disponíveis em dicionários acessíveis ao programa. Eu indicaria os documentos, mas não estou acessando o python.org no momento. Mas esta nota no mail.python.org fornecerá um primeiro ponteiro . Veja as bibliotecas CGI e URLLIB Python para obter mais.

Atualizar

Ok, esse link foi eliminado. Aqui está a referência básica do wsgi

Charlie Martin
fonte
Se você não é ambicioso o suficiente para seguir um link, não sou ambicioso o suficiente para recortar e colar se for do link.
10139 Charlie Martin
1
e agora o link está inoperante, e é por isso que todo mundo odeia respostas como essa e as rebate. Parabéns.
precisa
2
Você sabe, toda vez que recebo um comentário de alguém reclamando que uma resposta de cinco anos e quase seis anos agora tem um link quebrado, sem, digamos, adicionar um link de substituição, posso apostar que é alguém com um representante <1000.
Charlie Martin
Se eu soubesse aonde ir para o link de substituição (dica, não o fiz porque o seu link não funcionava), não teria pesquisado esta questão.
quer
Você sempre pode tentar a dica sobre 'libs python CGI e URLLIB', suponho.
Charlie Martin
0

Python é apenas uma linguagem, para obter dados GET e POST, você precisa de uma estrutura da web ou de um kit de ferramentas escrito em Python. Django é um, como Charlie aponta, os módulos padrão cgi e urllib são outros. Também estão disponíveis Turbogears, Pylons, CherryPy, web.py, mod_python, fastcgi, etc., etc.

No Django, suas funções de exibição recebem um argumento de solicitação que possui request.GET e request.POST. Outras estruturas farão isso de maneira diferente.

Ned Batchelder
fonte
13
"Para chegar GET e POST dados, você precisa de um framework web ou kit de ferramentas escrito em Python" - simplesmente não é verdade
James Tomasino
2
Eu concordo com James, se eles são escritos em Python, eles podem ser escritos claramente novamente de acordo com sua preferência.
Robin Sandström
Ok, eu sou um novato em python e pensei que não seria possível que eu tivesse que usar um framework. Minha pergunta é qual é o caminho? Eu não estou usando nenhuma estrutura e eu tinha apache2 servir um script python. Será bom mostrar uma maneira simples, como o uso de $ _GET ou $ _POST no php.
sensei preto
1
@ JamesTomasino No contexto da pergunta, é verdade.
peterh - Restabelece Monica