web-dev-qa-db-ja.com

POSTおよびGET変数はPythonでどのように処理されますか?

PHPでは、POSTには$_POSTを、GET(クエリ文字列)変数には$_GETを使用できます。 Pythonで同等のものは何ですか?

134
Click Upvote

これでhtmlフォームを投稿するとします:

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

raw cgi を使用する場合:

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

DjangoPylonsFlask または Pyramid を使用する場合:

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

そのため、これらのフレームワークのいずれかを選択する必要があります。

235
nosklo

これは古い質問です。しかし、良い答えが与えられなかったことは驚くべきことです。

まず第一に、フレームワークに言及せずに質問は完全に有効です。 CONTEXTはPHP言語と同等です。 Pythonでクエリ文字列パラメーターを取得する方法は多数ありますが、フレームワーク変数には便利なデータが設定されています。 PHPでは、$ _ GETと$ _POSTも便利な変数です。これらはそれぞれQUERY_URIおよびphp:// inputから解析されます。

Pythonでは、これらの関数はos.getenv( 'QUERY_STRING')およびsys.stdin.read()になります。 osおよびsysモジュールをインポートすることを忘れないでください。

ここで「CGI」という言葉に注意する必要があります。特に、2つの言語と、Webサーバーとのインターフェイスの共通点について話すときは注意が必要です。 1.プロトコルとしてのCGIは、HTTPプロトコルのデータ転送メカニズムを定義します。 2. Pythonは、ApacheでCGIスクリプトとして実行するように構成できます。 3. Pythonのc​​giモジュールは、いくつかの便利な機能を提供します。

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ポインター例外が発生します。パラメータも。

31
Schien

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

これらは、CGI fieldstorageオブジェクトに保存されます。

import cgi
form = cgi.FieldStorage()

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

CGIフレームワークとして使用するものに多少依存しますが、プログラムからアクセスできる辞書で利用できます。ドキュメントを紹介しますが、現時点ではpython.orgにアクセスできません。しかし、 mail.python.orgのこのメモは最初のポインターを提供します 。詳細については、CGIおよびURLLIB Python libsをご覧ください。

更新

さて、そのリンクは破壊されました。 基本的なwsgi ref

2
Charlie Martin

Pythonは単なる言語です。GETおよびPOSTデータを取得するには、Pythonで作成されたWebフレームワークまたはツールキットが必要です。 Djangoは1つです。Charlieが指摘しているように、cgiとurllibの標準モジュールは他のものです。 Turbogears、Pylons、CherryPy、web.py、mod_python、fastcgiなども利用可能です。

Djangoでは、ビュー関数はrequest.GETとrequest.POSTを持つrequest引数を受け取ります。他のフレームワークでは異なる方法で処理されます。

0
Ned Batchelder