Bagaimana variabel POST dan GET ditangani dengan Python?


137

Di PHP Anda hanya bisa menggunakan $_POSTuntuk POST dan $_GETuntuk variabel GET (Query string). Apa yang setara dengan Python?


Apakah Anda menulis skrip CGI, mod_python, atau aplikasi Django (atau kerangka lain)? Jawabannya bergantung pada lebih banyak info ...
Rob

dapatkah Anda memberikan kode contoh untuk masing-masing ini?
Klik Upvote

2
CGI, mod_python, Django, CherryPy dan Pylons bukanlah contoh kode. Itu adalah Kerangka Web Python yang menangani GET dan POST. Lihat wiki.python.org/moin/WebFrameworks untuk informasi. Pertanyaan Anda - seperti yang ditanyakan - tidak dapat dijawab.
S. Lotot

Jawaban:


249

misalkan Anda memposting formulir html dengan ini:

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

Jika menggunakan cgi mentah :

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

Jika menggunakan Django , Pylons , Flask atau Pyramid :

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

Menggunakan Turbogears , Cherrypy :

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

Web.py :

form = web.input()
print form.username

Werkzeug :

print request.form['username']

Jika menggunakan Cherrypy atau Turbogears, Anda juga dapat menentukan fungsi penangan Anda dengan mengambil parameter secara langsung:

def index(self, username):
    print username

Mesin Aplikasi Google :

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

Jadi, Anda benar-benar harus memilih salah satu kerangka kerja tersebut.


19
Menggunakan import cgi, bukan print form["username"].value?
J.Katzwinkel

Saya menggunakan Bottleyang saya percaya gunakan wsgi, adakah yang bisa memposting yang setara untuk digunakan dalam skenario itu? Tanggapan di atas adalah penjelasan paling jelas yang saya temukan, hanya saja tidak termasuk skenario saya.
pengguna1063287

2
FieldStorage rusak di python3, Anda mungkin mengalami masalah dengannya. bugs.python.org/issue6234
NuclearPeon

2
Izinkan saya untuk mengklarifikasi komentar saya sebelumnya; halaman ini: lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode lebih baik menjelaskannya. Jangan gunakan FieldStorage () di python 3 karena masalah encoding.
NuclearPeon

Untuk Flask sedikit berbeda: request.args.get ('username')
Damjan Pavlica

35

Saya tahu ini pertanyaan lama. Namun sangat mengejutkan bahwa tidak ada jawaban yang baik yang diberikan.

Pertama-tama pertanyaan tersebut sepenuhnya valid tanpa menyebutkan kerangka kerjanya. KONTEKS adalah persamaan bahasa PHP. Meskipun ada banyak cara untuk mendapatkan parameter string kueri dengan Python, variabel kerangka kerja hanya diisi dengan mudah. Di PHP, $_GETdan $_POSTjuga variabel kenyamanan. Mereka diurai masing-masing dari QUERY_URI dan php: // input.

Di Python, fungsi ini akan menjadi os.getenv('QUERY_STRING')dan sys.stdin.read(). Ingatlah untuk mengimpor modul os dan sys.

Kita harus berhati-hati dengan kata "CGI" di sini, terutama jika berbicara tentang dua bahasa dan kesamaannya saat berinteraksi dengan server web. 1. CGI, sebagai protokol, mendefinisikan mekanisme transpor data dalam protokol HTTP. 2. Python dapat dikonfigurasi untuk dijalankan sebagai skrip CGI di Apache. 3. Modul CGI dengan Python menawarkan beberapa fungsi kemudahan.

Karena protokol HTTP tidak bergantung pada bahasa, dan ekstensi CGI Apache juga tidak bergantung pada bahasa, mendapatkan parameter GET dan POST seharusnya hanya memiliki perbedaan sintaks antar bahasa.

Inilah rutinitas Python untuk mengisi kamus GET:

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

dan untuk 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

Sekarang Anda dapat mengakses bidang sebagai berikut:

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

Saya juga harus menunjukkan bahwa modul CGI tidak berfungsi dengan baik. Pertimbangkan permintaan HTTP ini:

POST / test.py?user_id=6

user_name=Bob&age=30

Penggunaan CGI.FieldStorage().getvalue('user_id')akan menyebabkan pengecualian pointer nol karena modul secara membabi buta memeriksa data POST, mengabaikan fakta bahwa permintaan POST juga dapat membawa parameter GET.


Saya mendapat kesalahan ini: AttributeError: 'NoneType' object has no attribute 'split'menggunakan CGIdengan Python2.7
candlejack

1
Tentang kesalahan @candlejack berkata, coba dapatkan argumen seperti ini POST.get('user_name', 'default_value').
George Siggouroglou

@GeorgeSiggouroglou Masalah 'default_value' memecahkan masalah saya. Terima kasih!
umbe1987

1
Pasti jawaban favorit saya sejauh ini! +1
umbe1987

QUERY_STRING bukan indeks yang valid di Mac
Samuel Ev

31

Saya telah menemukan jawaban nosklo sangat luas dan berguna! Bagi mereka, seperti saya, yang mungkin menemukan mengakses data permintaan mentah secara langsung juga berguna, saya ingin menambahkan cara untuk melakukannya:

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

Saya mencoba memanggil metode dalam file cgi. Contoh url adalah http://www.myserver.com/cgi-bin/cgi.py/ThisIsMyMethod. Variabel lingkungan berikut terkait: os.environ.get('PATH_INFO')yang mendapatkan nama metode (misalnya: / ThisIsMyMethod) dan os.environ.get('SCRIPT_NAME')yang menyediakan jalur ke skrip dari folder akar host web (misalnya: /cgi-bin/cgi.py). Dalam kasus saya, QUERY_STRING kosong, karena saya menggunakan POST.
NuclearPeon

28

Mereka disimpan dalam objek penyimpanan bidang CGI.

import cgi
form = cgi.FieldStorage()

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

2
-1. Ada cukup banyak representasi dari objek request, bergantung pada libs / framework yang digunakan.
bruno desthuilliers

10
Saya tidak yakin mengapa Anda melakukannya -1. Maksud saya, apa yang saya berikan berhasil. Mungkin dia tidak dapat menggunakan kerangka kerja. Juga, bukankah kebanyakan framework hanya menggunakan ini di latar belakang?
Evan Fosmark

4
Bodoh untuk melakukan -1, saya telah memberi +1 untuk menyeimbangkannya, ditambah lagi saya pikir ini adalah metode terbaik karena mengembalikan sengatan (yang diminta)
joedborg

1
@ Liam Tidak yakin mengapa Anda mendapatkan Tidak ada, tetapi posting ini sudah lebih dari 6 tahun, jadi saya tidak akan ragu jika ada yang berubah.
Evan Fosmark

@EvanFosmark Saya mendapatkan nilai Tidak Ada dengan menggunakan ini. Ketika saya mencetak nilai yang dikembalikan dari cgi.FeildStorage, inilah keluarannya FieldStorage (None, None, []). Saya telah mengirimkan pertanyaan lengkap di sini stackoverflow.com/questions/38024516/… Bantuan apa pun akan dihargai.
Chor Sipahi

1

Ini agak tergantung pada apa yang Anda gunakan sebagai kerangka CGI, tetapi mereka tersedia dalam kamus yang dapat diakses oleh program. Saya akan mengarahkan Anda ke dokumennya, tetapi saya tidak dapat mengakses python.org sekarang. Tetapi catatan di mail.python.org ini akan memberi Anda petunjuk pertama . Lihat libs CGI dan URLLIB Python untuk lebih lanjut.

Memperbarui

Oke, tautan itu rusak. Berikut referensi wsgi dasar


Jika Anda tidak cukup ambisius untuk mengikuti tautan, saya tidak cukup ambisius untuk memotong dan menempelkan jika dari tautan tersebut.
Charlie Martin

1
dan sekarang tautannya sudah mati dan itulah mengapa semua orang membenci jawaban seperti ini dan tidak menyukainya. Selamat.
John Tyree

2
Anda tahu, setiap kali saya mendapat komentar dari seseorang yang mengomel bahwa jawaban berusia lima - hampir enam tahun sekarang memiliki tautan yang rusak, tanpa, katakanlah, menambahkan tautan pengganti, saya dapat bertaruh itu adalah seseorang dengan perwakilan <1000.
Charlie Martin

Jika saya tahu ke mana harus mencari tautan pengganti (petunjuk, saya tidak melakukannya karena tautan Anda tidak berfungsi), saya tidak akan mencari pertanyaan ini.
John Tyree

Anda selalu bisa mencoba petunjuk tentang 'CGI dan URLLIB python libs' saya kira.
Charlie Martin

0

Python hanyalah sebuah bahasa, untuk mendapatkan data GET dan POST, Anda membutuhkan web framework atau toolkit yang ditulis dengan Python. Django adalah satu, seperti yang ditunjukkan Charlie, modul standar cgi dan urllib adalah yang lainnya. Juga tersedia Turbogears, Pylons, CherryPy, web.py, mod_python, fastcgi, dll, dll.

Dalam Django, fungsi tampilan Anda menerima argumen permintaan yang memiliki request.GET dan request.POST. Kerangka lain akan melakukannya secara berbeda.


13
"untuk mendapatkan data GET dan POST, Anda memerlukan kerangka kerja web atau toolkit yang ditulis dengan Python" - Tidak benar
James Tomasino

2
Saya setuju dengan James, jika ditulis dengan Python, mereka dapat dengan jelas ditulis kembali sesuai keinginan Anda.
Robin Sandström

Ok saya pendatang baru di python dan saya pikir tidak mungkin saya harus menggunakan framework. Pertanyaan saya adalah bagaimana caranya? Saya tidak menggunakan kerangka kerja apa pun dan saya memiliki apache2 melayani skrip python. Alangkah baiknya menunjukkan cara sederhana yang mati seperti penggunaan $ _GET atau $ _POST di php.
sensei hitam

1
@JamesTomasino Dalam konteks pertanyaannya, itu benar.
peterh - Pulihkan Monica
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.