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


135

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


CGIスクリプト、mod_python、またはDjango(またはその他のフレームワーク)アプリケーションを作成していますか?もう少し詳細に回答ヒンジ...
ロブ

これらそれぞれのサンプルコードを提供できますか?
2009年

2
CGI、mod_python、Django、CherryPy、およびPylonsはコードサンプルではありません。GETとPOSTを処理するPython Webフレームワークです。詳細については、wiki.python.org / moin / WebFrameworksを参照してください。あなたの質問-尋ねられた-は答えられません。
S.Lott、2009年

回答:


246

これを使って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

ターボギア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

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.カッツウィンケル2013

私が使用しBottleていると思わwsgiれるものを使用していますが、そのシナリオで使用するための同等のものを誰かが投稿できますか?上記の応答は、私が遭遇した最も明確な説明であり、私のシナリオは含まれていません。
user1063287 2013

2
FieldStorageはpython3で壊れています。問題が発生する可能性があります。bugs.python.org/issue6234
NuclearPeon

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」という単語に注意する必要があります。特に、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ポインタ例外が発生します。


私はこのエラーを得た:AttributeError: 'NoneType' object has no attribute 'split'使用しCGIPython2.7
candlejack

1
@candlejackが言ったエラーについて、このような引数を取得してみてくださいPOST.get('user_name', 'default_value')
George Siggouroglou

@GeorgeSiggouroglou「default_value」で問題が解決しました。ありがとう!
umbe1987

1
間違いなくこれまでのところ私のお気に入りの答えです!+1
umbe1987

QUERY_STRINGはMacでは有効なインデックスではありません
Samuel 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ファイルのメソッド呼び出そうとしています。URLの例は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)からスクリプトへのパスを提供します。私の場合、POSTを使用しているため、QUERY_STRINGは空白です。
NuclearPeon 2014

28

それらはCGI fieldstorageオブジェクトに格納されます。

import cgi
form = cgi.FieldStorage()

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

2
-1。使用されるlibs / frameworkに応じて、リクエストオブジェクトのかなりの数の表現があります。
ブルーノdesthuilliers 2009年

10
なぜ-1をしたのか分かりません。つまり、私が与えたものは作品です。おそらく彼はフレームワークを使用することができません。また、ほとんどのフレームワークはこれをバックグラウンドで使用しませんか?
エヴァンフォスマルク2009年

4
-1するのはバカだったし、バランスをとるために+1したし、それに、スティングを返すのでこれが最善の方法だと思う(これは求められていることだ)
joedborg

1
@LiamなぜNoneを取得しているのかわかりませんが、この投稿は6年以上前のものなので、状況が変わっていても疑いはありません。
Evan Fosmark 2015年

@EvanFosmarkこれを使用してNone値を取得しています。cgi.FeildStorageから返された値を出力すると、FieldStorage(None、None、[])が出力されます。私はここに完全な質問を投稿しましたstackoverflow.com/questions/38024516/…どんな助けでもありがたいです。
Chor Sipahi 2016年

1

CGIフレームワークとして何を使用するかによって多少異なりますが、プログラムからアクセス可能な辞書で使用できます。ドキュメントを紹介しますが、今はpython.orgにアクセスしていません。しかし、mail.python.orgに関するこのメモでは、最初の指針を示します。詳細については、CGIおよびURLLIB Pythonライブラリを参照してください。

更新

わかりました、そのリンクは破壊されました。これが基本的なwsgi refです


リンクをたどるほどの野心がない場合、私はリンクからの場合はカットアンドペーストするほど野心的ではありません。
チャーリーマーティン

1
そして今、リンクは切れており、それが誰もがこのような答えを嫌い、反対票を投じる理由です。おめでとう。
John Tyree、2014年

2
交換用のリンクを追加して、たとえば、なしで、私は担当者<1000とそれの誰かを賭けることができる、歳の答え今壊れたリンクを持っている-ほぼ6 -あなたは、私は5つのことを格好いい人からコメントをもらうたびに、知っています
チャーリーマーティン

交換用リンクの入手先がわかっている場合(ヒント、リンクが機能しなかったためにそうではなかった)、この質問を調べていなかっただろう。
John Tyree、2014年

私が思う「CGI and URLLIB python libs」に関するヒントをいつでも試すことができます。
チャーリーマーティン

0

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

Djangoでは、ビュー関数はrequest.GETとrequest.POSTを持つリクエスト引数を受け取ります。他のフレームワークは別の方法でそれを行います。


13
「GETおよびPOSTデータを取得するには、Pythonで記述されたWebフレームワークまたはツールキットが必要です」-単に正しくない
James Tomasino '30

2
私はジェームズに同意します。Pythonで書かれていれば、自分の好みに合わせて明確に書き直すことができます。
RobinSandström2014

私はPythonの新人です。フレームワークを使用する必要はあり得ないと思いました。私の質問は、方法は何ですか?私はフレームワークを使用しておらず、apache2にpythonスクリプトを提供させていました。PHPでの$ _GETまたは$ _POSTの使用法として、非常にシンプルな方法を示すのは良いことです。
黒の先生

1
@JamesTomasino質問の文脈では、それは本当です。
peterh-2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.