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:
classSomeHandler(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.
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.
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:
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.
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()
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")
-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
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.
"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.
Respostas:
suponha que você esteja postando um formulário html com este:
Se estiver usando cgi bruto :
Se estiver usando Django , Pylons , Flask ou Pyramid :
Usando Turbogears , Cherrypy :
Web.py :
Werkzeug :
Se estiver usando Cherrypy ou Turbogears, também é possível definir sua função de manipulador usando um parâmetro diretamente:
Google App Engine :
Então você realmente terá que escolher uma dessas estruturas.
fonte
import cgi
, não éprint form["username"].value
?Bottle
que eu acredito que usawsgi
, 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.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,
$_GET
e$_POST
també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')
esys.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:
e para o POST:
Agora você pode acessar os campos da seguinte maneira:
Devo também salientar que o módulo CGI não funciona bem. Considere esta solicitação HTTP:
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.fonte
AttributeError: 'NoneType' object has no attribute 'split'
usandoCGI
comPython
2,7POST.get('user_name', 'default_value')
.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:
fonte
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) eos.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.Eles são armazenados no objeto de armazenamento de campo CGI.
fonte
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
fonte
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.
fonte