PythonでPOSTおよびGET変数はどのように処理されますか?
質問
PHPでは、POSTに$_POST
を、GET(クエリ文字列)変数に$_GET
を使用できます。 Pythonで同等のものは何ですか?
解決
これでhtmlフォームを投稿するとします:
<input type="text" name="username">
raw cgi を使用している場合:
import cgi
form = cgi.FieldStorage()
print form["username"]
Django を使用している場合、パイロン、 Flask またはピラミッド:
print request.GET['username'] # for GET form method
print request.POST['username'] # for POST form method
Turbogears を使用して、 Cherrypy :
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
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
したがって、これらのフレームワークのいずれかを選択する必要があります。
他のヒント
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()
これは古い質問です。しかし、良い答えが与えられなかったことは驚くべきことです。
まず第一に、フレームワークについて言及しなくても、質問は完全に有効です。 CONTEXTはPHP言語と同等です。 Pythonでクエリ文字列パラメーターを取得する方法は多数ありますが、フレームワーク変数には便利なデータが設定されています。 PHPでは、$ _ GETと$ _POSTも便利な変数です。これらはそれぞれQUERY_URIおよびphp:// inputから解析されます。
Pythonでは、これらの関数はos.getenv( 'QUERY_STRING')およびsys.stdin.read()になります。 osおよびsysモジュールを忘れずにインポートしてください。
<!> quot; CGI <!> quot;という単語に注意する必要があります。ここでは、特に2つの言語と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パラメーターを伝送できるという事実を無視するため、nullポインター例外が発生します。
これらはCGI fieldstorageオブジェクトに保存されます。
import cgi
form = cgi.FieldStorage()
print "The user entered %s" % form.getvalue("uservalue")
CGIフレームワークとして使用するものに多少依存しますが、プログラムからアクセス可能な辞書で利用できます。ドキュメントを紹介しますが、現時点ではpython.orgにアクセスできません。しかし、 mail.python.orgのこのメモは、最初に提供しますポインター。 CGIおよびURLLIB Pythonライブラリの詳細をご覧ください。
更新
さて、そのリンクは破壊されました。 基本的なwsgi ref
は次のとおりです。Pythonは単なる言語です。GETおよびPOSTデータを取得するには、Pythonで作成されたWebフレームワークまたはツールキットが必要です。 Djangoは1つです。Charlieが指摘しているように、cgiとurllibの標準モジュールは他のものです。 Turbogears、Pylons、CherryPy、web.py、mod_python、fastcgiなども利用できます。
Djangoでは、ビュー関数はrequest.GETおよびrequest.POSTを持つリクエスト引数を受け取ります。他のフレームワークでは異なる方法で処理されます。