如何在Python中处理POST和GET变量?


135

在PHP中,您只能将其$_POST用于POST和$_GETGET(查询字符串)变量。Python中的等效功能是什么?


您是在编写CGI脚本,mod_python还是Django(或其他框架)应用程序?答案取决于更多信息...
罗布2009年

您可以为每个提供示例代码吗?
点击Upvote

2
CGI,mod_python,Django,CherryPy和Pylons不是代码示例。它们是处理GET和POST的Python Web框架。有关信息,请参见wiki.python.org/moin/WebFrameworks。您的问题-被询问-无法回答。
S.Lott,

Answers:


246

假设您正在发布带有以下内容的html表单:

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

如果使用原始cgi

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

如果使用DjangoPylonsFlaskPyramid

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

使用TurbogearsCherrypy

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

Web.py

form = web.input()
print form.username

Werkzeug

print request.form['username']

如果使用Cherrypy或Turbogears,还可以直接使用参数定义处理程序函数:

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

因此,您实际上必须选择这些框架之一。


18
使用import cgi,不是print form["username"].value吗?
J. Katzwinkel

我使用的Bottle是我认为可以使用的wsgi,有人可以在该场景下发布与之等效的东西吗?上面的回答是我遇到的最清晰的解释,只是不包括我的情况。
user1063287 2013年

2
FieldStorage在python3中损坏,您可能会遇到问题。bugs.python.org/issue6234
NuclearPeon 2013年

2
请允许我澄清我以前的评论;本页:lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode对此进行了更好的解释。由于编码问题,请勿在python 3中使用FieldStorage()。
NuclearPeon 2014年

对于Flask来说有点不同:request.args.get('username')
Damjan Pavlica

35

我知道这是一个老问题。然而令人惊讶的是,没有给出好的答案。

首先,这个问题是完全有效的,而无需提及框架。CONTEXT是PHP语言的等效项。尽管有很多方法可以在Python中获取查询字符串参数,但是可以方便地填充框架变量。在PHP中,$_GET并且$_POST也方便变量。它们分别从QUERY_URI和php:// input解析。

在Python中,这些函数将是os.getenv('QUERY_STRING')sys.stdin.read()。记住要导入os和sys模块。

我们在这里必须小心使用“ CGI”一词,尤其是在谈论两种语言及其与Web服务器接口时的通用性时。1. CGI作为协议,定义了HTTP协议中的数据传输机制。2.可以将Python配置为在Apache中作为CGI脚本运行。3. Python中的CGI模块提供了一些便利功能。

由于HTTP协议与语言无关,并且Apache的CGI扩展也与语言无关,因此获取GET和POST参数仅应具有跨语言的语法差异。

这是填充GET字典的Python例程:

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

对于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

您现在可以按以下方式访问字段:

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

我还必须指出,CGI模块不能很好地工作。考虑以下HTTP请求:

POST / test.py?user_id=6

user_name=Bob&age=30

使用CGI.FieldStorage().getvalue('user_id')将导致空指针异常,因为该模块盲目检查POST数据,而忽略了POST请求也可以携带GET参数的事实。


我收到此错误:与2.7 AttributeError: 'NoneType' object has no attribute 'split'CGIPython
一起

1
关于错误@candlejack说,尝试获取像这样的参数POST.get('user_name', 'default_value')
George Siggouroglou

@GeorgeSiggouroglou'default_value'问题解决了我的问题。谢谢!
umbe1987 '19

1
到目前为止,绝对是我最喜欢的答案!+1
umbe1987 '19

QUERY_STRING不是在Mac上的有效指标
塞缪尔EV

31

我发现nosklo的答案非常广泛且有用!对于像我这样的人,他们可能会发现直接访问原始请求数据也很有用,我想添加一种方法:

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()

我正在尝试在cgi文件中调用方法。网址示例是http://www.myserver.com/cgi-bin/cgi.py/ThisIsMyMethod。与以下环境变量相关:os.environ.get('PATH_INFO')它获取方法名称(例如:/ ThisIsMyMethod),os.environ.get('SCRIPT_NAME')并提供从Web主机的根文件夹(例如:/cgi-bin/cgi.py)到脚本的路径。就我而言,QUERY_STRING为空白,因为我正在使用POST。
NuclearPeon 2014年

28

它们存储在CGI fieldtorage对象中。

import cgi
form = cgi.FieldStorage()

print "The user entered %s" % form.getvalue("uservalue")

2
-1。根据所使用的库/框架,请求对象有很多表示形式。
bruno desthuilliers,2009年

10
我不确定为什么你要-1。我的意思是,我给的作品。也许他无法使用框架。另外,难道大多数框架都不会在后台使用它吗?
Evan Fosmark,2009年

4
做-1是愚蠢的,我需要+1来平衡它,再加上我认为这是最好的方法,因为它会返回刺痛(这是要求的)
joedborg 2012年

1
@Liam不确定您为什么会获得None,但是此职位已有6年以上的历史,因此我不会怀疑情况是否已更改。
Evan Fosmark 2015年

@EvanFosmark我正在使用此获取无值。当我打印从cgi.FeildStorage返回的值时,这就是FieldStorage(None,None,[])的输出。我在这里stackoverflow.com/questions/38024516/…发表了一个完整的问题。任何帮助将不胜感激。
Chor Sipahi

1

它在某种程度上取决于您用作CGI框架的方式,但是在程序可访问的字典中可以找到它们。我会向您指出这些文档,但现在还没有到达python.org。但是mail.python.org上的此注释将为您提供第一个指针。查看CGI和URLLIB Python库以获取更多信息。

更新资料

好的,该链接无效。这是基本的wsgi参考


如果您没有足够的野心去跟踪链接,那么如果从链接中进行剪切和粘贴,我也没有足够的野心。
查理·马丁

1
现在链接已失效,这就是为什么每个人都讨厌这样的答案并拒绝投票的原因。恭喜你
约翰·泰瑞

2
您知道,每次我收到某人的评论时,都会抱怨说一个5年-接近6年的答案现在链接已断开,而无需添加替换链接,我敢打赌这是rep <1000的人
查理·马丁(Charlie Martin)

如果我知道替换链接的位置(提示,我不是因为您的链接不起作用),那么我就不会一直在寻找这个问题。
约翰·泰瑞

我想您总是可以尝试一下有关“ CGI和URLLIB python库”的提示。
查理·马丁

0

Python仅是一种语言,要获取GET和POST数据,您需要使用Python编写的Web框架或工具包。查理指出,Django是一个,cgi和urllib标准模块是另一个。也可以使用Turbogears,Pylons,CherryPy,web.py,mod_python,fastcgi等。

在Django中,您的视图函数会接收一个带有request.GET和request.POST的请求参数。其他框架将采取不同的方式。


13
“要获取GET和POST数据,您需要使用Python编写的Web框架或工具包”-简直不正确
James Tomasino

2
我同意James的观点,如果他们是用Python编写的,显然可以根据自己的喜好再次编写它们。
罗宾·桑德斯特罗姆(RobinSandström)2014年

好的,我是python的新手,我认为必须使用框架是不可能的。我的问题是什么方式?我没有使用任何框架,而我让apache2提供了python脚本。在PHP中使用$ _GET或$ _POST来显示一种简单的死法将是一件好事。
黑色老师

1
@JamesTomasino在问题的上下文中,这是真的。
peterh-恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.