Python'da POST ve GET değişkenleri nasıl ele alınır?


135

PHP'de $_POSTPOST ve $_GETGET (Sorgu dizesi) değişkenleri için kullanabilirsiniz. Python'daki karşılığı nedir?


Bir CGI betiği, mod_python veya Django (veya başka bir çerçeve) uygulaması mı yazıyorsunuz? Cevabı biraz daha fazla bilgi ...
Rob

Bunların her biri için örnek kod sağlayabilir misiniz?
Click Olumlu oy

2
CGI, mod_python, Django, CherryPy ve Pylons kod örnekleri değildir. Bunlar GET ve POST işlemlerini gerçekleştiren Python Web Çerçeveleridir. Bilgi için bkz. Wiki.python.org/moin/WebFrameworks . Sorunuz - istendiği gibi - cevaplanamıyor.
S.Lott

Yanıtlar:


246

bununla birlikte bir html formu gönderdiğinizi varsayalım:

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

Ham cgi kullanıyorsanız :

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

Kullanılıyorsa Django , Pylons , Flask veya Piramit :

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

Turbogears , Cherrypy kullanarak :

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

Web.py :

form = web.input()
print form.username

Werkzeug :

print request.form['username']

Cherrypy veya Turbogears kullanıyorsanız, doğrudan parametre alarak işleyici işlevinizi de tanımlayabilirsiniz:

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

Yani bu çerçevelerden birini seçmek zorunda kalacaksınız.


18
Kullanıyor import cgideğil mi print form["username"].value?
J. Katzwinkel

Ben kullandığım Bottleinanıyorum kullanıyorum wsgi, kimse bu senaryoda kullanmak için eşdeğer gönderebilir miyim? Yukarıdaki yanıt, karşılaştığım en açık açıklamadır, sadece senaryomu içermez.
user1063287

2
FieldStorage python3'te bozuldu, onunla ilgili sorunlar yaşayabilirsiniz. bugs.python.org/issue6234
NuclearPeon

2
Önceki yorumumu netleştirmeme izin ver; bu sayfa: lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode bunu daha iyi açıklıyor. Kodlama sorunları nedeniyle python 3'te FieldStorage () kullanmayın.
NuclearPeon

Flask için biraz farklı: request.args.get ('kullanıcı adı')
Damjan Pavlica

35

Bunun eski bir soru olduğunu biliyorum. Yine de iyi bir cevap verilmemesi şaşırtıcı.

Her şeyden önce soru, çerçeveden bahsetmeden tamamen geçerlidir. CONTEXT bir PHP dil denkliğidir. Python'da sorgu dizesi parametrelerini almanın birçok yolu olmasına rağmen, çerçeve değişkenleri uygun şekilde doldurulur. PHP $_GETve $_POSTaynı zamanda kolaylık değişkenleridir. Sırasıyla QUERY_URI ve php: // girdilerinden ayrıştırılırlar.

Python'da bu işlevler os.getenv('QUERY_STRING')ve olur sys.stdin.read(). İşletim sistemi ve sys modüllerini almayı unutmayın.

Burada, özellikle bir web sunucusuyla etkileşim kurarken iki dil ve onların ortak özelliklerinden bahsederken "CGI" kelimesine dikkat etmeliyiz. 1. CGI, bir protokol olarak, HTTP protokolündeki veri aktarım mekanizmasını tanımlar. 2. Python, Apache'de CGI betiği olarak çalışacak şekilde yapılandırılabilir. 3. Python'daki CGI modülü bazı kolaylık fonksiyonları sunar.

HTTP protokolü dilden bağımsız olduğu ve Apache'nin CGI uzantısı da dilden bağımsız olduğu için, GET ve POST parametrelerini almak, diller arasında yalnızca sözdizimi farklılıkları taşımalıdır.

İşte bir GET sözlüğünü doldurmak için Python yordamı:

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

ve POST için:

POST={}
args=sys.stdin.read().split('&')

for arg in args: 
    t=arg.split('=')
    if len(t)>1: k, v=arg.split('='); POST[k]=v

Artık alanlara aşağıdaki gibi erişebilirsiniz:

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

Ayrıca CGI modülünün iyi çalışmadığını da belirtmeliyim. Bu HTTP isteğini düşünün:

POST / test.py?user_id=6

user_name=Bob&age=30

CGI.FieldStorage().getvalue('user_id')Modül POST verilerini körü körüne kontrol ettiğinden, POST isteğinin GET parametrelerini de taşıyabildiğini göz ardı ettiği için, kullanmak boş bir işaretçi istisnasına neden olur.


Bu hatayı aldım: 2.7 ile AttributeError: 'NoneType' object has no attribute 'split'kullanıyorumCGIPython
CandleJack

1
@Candlejack'in yaptığı hata hakkında böyle argümanları almayı deneyin POST.get('user_name', 'default_value').
George Siggouroglou

@GeorgeSiggouroglou 'default_value' olayı sorunumu çözdü. Teşekkürler!
umbe1987

1
Kesinlikle benim en sevdiğim cevap şimdiye kadar! +1
umbe1987

QUERY_STRING Mac'te geçerli bir dizin değil
Samuel Ev

31

Nosklo'nun cevabını çok kapsamlı ve kullanışlı buldum! Benim gibi, ham istek verilerine doğrudan da yararlı bulabilecekler için, bunu yapmanın yolunu eklemek istiyorum:

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

Bir cgi dosyasındaki bir yöntemi çağırmaya çalışıyorum . Örnek bir url http://www.myserver.com/cgi-bin/cgi.py/ThisIsMyMethod. Aşağıdaki çevresel değişkenler birbiriyle ilişkilidir: os.environ.get('PATH_INFO')yöntem adını alır (örneğin: / ThisIsMyMethod) ve os.environ.get('SCRIPT_NAME')web ana bilgisayarının kök klasöründen (örn: /cgi-bin/cgi.py) komut dosyasına giden yolu sağlar. Benim durumumda, POST kullandığım için QUERY_STRING boş.
NuclearPeon

28

CGI fieldtorage nesnesinde saklanırlar.

import cgi
form = cgi.FieldStorage()

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

2
-1. kullanılan kütüphanelere / çerçeveye bağlı olarak, istek nesnesinin oldukça az gösterimi vardır.
bruno desthuilliers

10
Neden -1 yaptığından emin değilim. Demek istediğim, verdiğim işler. Belki de bir çerçeve kullanamıyor. Ayrıca, çoğu çerçeve bunu arka planda kullanmıyor mu?
Evan Fosmark

4
-1 yapmak için aptalcaydım, dengelemek için +
1'ledim

1
@Liam Niçin None aldığınızdan emin değilim, ancak bu yazı 6 yaşın üzerindedir, bu yüzden işler değiştiğinden şüphe etmem.
Evan Fosmark

@EvanFosmark Bunu kullanarak Yok değerleri alıyorum. Cgi.FeildStorage'dan döndürülen değeri yazdırdığımda çıktı FieldStorage (Yok, Yok, []) budur. Burada tam bir soru yayınladım stackoverflow.com/questions/38024516/… Herhangi bir yardım takdir edilecektir.
Chor Sipahi

1

Biraz CGI çerçevesi olarak ne kullandığınıza bağlıdır, ancak bunlar program tarafından erişilebilen sözlüklerde mevcuttur. Sizi dokümanlara yönlendirirdim, ama şu anda python.org'a geçemiyorum. Ancak mail.python.org'daki bu not size ilk işaretçisi verecektir . Daha fazla bilgi için CGI ve URLLIB Python kütüphanelerine bakın.

Güncelleme

Tamam, bu bağlantı koptu. İşte temel wsgi ref


Bir bağlantıyı takip edecek kadar iddialı değilseniz, bağlantıdan kesip yapıştıracak kadar iddialı değilim.
Charlie Martin

1
ve şimdi bağlantı öldü ve bu yüzden herkes böyle cevaplardan nefret ediyor ve onları aşağılıyor. Tebrikler.
John Tyree

2
Bilirsiniz, beş - neredeyse altı yaşındaki bir cevabın artık bozuk bir bağlantıya sahip olduğunu söyleyen birinden her yorum aldığımda, diyelim ki, yeni bir bağlantı eklemeden, <1000 olan biriyle bahse girebilirim.
Charlie Martin

Yedek bağlantı için nereye gideceğimi bilseydim (ipucu, bağlantınız çalışmadığı için yapmadım) bu soruyu aramazdım.
John Tyree

Sen olabilir hep CGI ve urllib piton kütüphanelerini 'hakkında ipucu denemek herhalde.
Charlie Martin

0

Python sadece bir dildir, GET ve POST verilerini almak için Python'da yazılmış bir web çerçevesine veya araç setine ihtiyacınız vardır. Django, Charlie'nin belirttiği gibi, cgi ve urllib standart modülleri diğerleri. Ayrıca Turbogears, Pilonlar, CherryPy, web.py, mod_python, fastcgi, vb.

Django'da, görünüm işlevleriniz request.GET ve request.POST içeren bir istek bağımsız değişkeni alır. Diğer çerçeveler bunu farklı yapacak.


13
"GET ve POST verilerini elde etmek için Python ile yazılmış bir web çerçevesine veya araç setine ihtiyacınız var" - Tek kelimeyle doğru değil
James Tomasino

2
James'e katılıyorum, Python'da yazılmışlarsa, kendi tercihinize göre tekrar yazılabilirler.
Robin Sandström

Tamam ben python yeni bir gelen ve bir çerçeve kullanmak zorunda mümkün olacağını düşündüm. Sorum ne olduğunu? Herhangi bir çerçeve kullanmıyorum ve apache2 bir python komut dosyası hizmet vardı. Php $ _GET veya $ _POST kullanımı olarak ölü basit bir yol gösteren güzel olacaktır.
black sensei

1
@JamesTomasino Soru bağlamında, doğrudur.
peterh - Monica'yı geri yükle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.