在PHP中,您只能将其$_POST
用于POST和$_GET
GET(查询字符串)变量。Python中的等效功能是什么?
在PHP中,您只能将其$_POST
用于POST和$_GET
GET(查询字符串)变量。Python中的等效功能是什么?
Answers:
假设您正在发布带有以下内容的html表单:
<input type="text" name="username">
如果使用原始cgi:
import cgi
form = cgi.FieldStorage()
print form["username"]
如果使用Django,Pylons,Flask或Pyramid:
print request.GET['username'] # for GET form method
print request.POST['username'] # for POST form method
from cherrypy import request
print request.params['username']
form = web.input()
print form.username
print request.form['username']
如果使用Cherrypy或Turbogears,还可以直接使用参数定义处理程序函数:
def index(self, username):
print username
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
因此,您实际上必须选择这些框架之一。
import cgi
,不是print form["username"].value
吗?
Bottle
是我认为可以使用的wsgi
,有人可以在该场景下发布与之等效的东西吗?上面的回答是我遇到的最清晰的解释,只是不包括我的情况。
我知道这是一个老问题。然而令人惊讶的是,没有给出好的答案。
首先,这个问题是完全有效的,而无需提及框架。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参数的事实。
AttributeError: 'NoneType' object has no attribute 'split'
CGI
Python
POST.get('user_name', 'default_value')
。
我发现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()
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。
它们存储在CGI fieldtorage对象中。
import cgi
form = cgi.FieldStorage()
print "The user entered %s" % form.getvalue("uservalue")
它在某种程度上取决于您用作CGI框架的方式,但是在程序可访问的字典中可以找到它们。我会向您指出这些文档,但现在还没有到达python.org。但是mail.python.org上的此注释将为您提供第一个指针。查看CGI和URLLIB Python库以获取更多信息。
更新资料
好的,该链接无效。这是基本的wsgi参考
Python仅是一种语言,要获取GET和POST数据,您需要使用Python编写的Web框架或工具包。查理指出,Django是一个,cgi和urllib标准模块是另一个。也可以使用Turbogears,Pylons,CherryPy,web.py,mod_python,fastcgi等。
在Django中,您的视图函数会接收一个带有request.GET和request.POST的请求参数。其他框架将采取不同的方式。