2009-02-09 12 views
30

WSGI kullanarak POST verilerine nasıl erişileceğini anlayamıyorum. Örneği wsgi.org web sitesinde denedim ve işe yaramadı. Şu anda Python 3.0 kullanıyorum. Lütfen WSGI çerçevesini önermiyorum, çünkü aradığım şey bu değil.WSGI'den POST Verisine Erişim

Bir fieldtorage nesnesine nasıl ulaşılacağını öğrenmek istiyorum.

+0

FWIW, bu noktada Python 3.0 için hala bir WSGI belirtimi yoktur, dolayısıyla yaptığınız her şey, herhangi bir son teknik özellik güncelleştirmesiyle uyumlu olmayabilir, çünkü Python 3.0 için söyleyebileceği şeyleri gerçekleştirme girişimleriyle uyumlu olmayabilir. . WSGI uygulamaları için Python 2.X ile kalmanız daha iyi. –

+6

@GrahamDumpleton Artık değil: http://www.python.org/dev/peps/pep-3333/ (Hadi bunu benim gibi daha sonra okuyan insanları da yanılmasın - zamanlarını da kurtarmayalım) – JeromeJ

+2

@JermoeJ - O yazdı 2009'da yorum yazdınız ve 2013'te yanıtlıyorsunuz; kimseyi yanlış yönlendirmeye çalıştığını düşünmeyin. :) – Sam

cevap

28

Bir FieldStorage nesnesine sadece POST verileri almak için çalışıyoruz varsayarsak:

# env is the environment handed to you by the WSGI server. 
# I am removing the query string from the env before passing it to the 
# FieldStorage so we only have POST data in there. 
post_env = env.copy() 
post_env['QUERY_STRING'] = '' 
post = cgi.FieldStorage(
    fp=env['wsgi.input'], 
    environ=post_env, 
    keep_blank_values=True 
) 
+0

Bu, Python 3.0'da çalışmaz - wsgi.input dizeleri yerine dönen baytlarla ilgili bir sorunu vardır. :(Python 3.0'da bunu yapmanın bir yoluna ihtiyacım var ... –

+0

Hangi WSGI işleyicisini kullanıyorsunuz? Yerleşik CGIHandler'ı kullanırsam, benim için iyi çalışır. Dosyamda "post.cgi" var http://pastebin.com/f40849562 adresindeki içeriğimle birlikte yerel sunucumun içeriği –

+0

Ne io sınıfı wsgi.input nedir? Eğer bir BufferedIOBase ise, o zaman bir TextIOWrapper içinde sarmanız gerekir, böylece cgi .FieldStorage kullanabilir. –

-1

Bazı çerçevelerin örnek için nasıl yapıldığını incelemenizi öneririm. (Sadece bir örnek olarak bunları kullanarak, herhangi bir tek tane tavsiye etmiyorum.) Burada

Werkzeug kodudur:

http://dev.pocoo.org/projects/werkzeug/browser/werkzeug/wrappers.py#L150

http://dev.pocoo.org/projects/werkzeug/browser/werkzeug/utils.py#L1420

Bu bir var çağrıları Burada özetlemek biraz karmaşık, bu yüzden yapmayacağım. WSGI henüz Python 3.0 için tam belirtilen ve popüler WSGI altyapısının çok olmadığını

+0

Hala Python 3.0'da çalışmıyor, ve ben de aradığım şey bu. Yine de teşekkürler. –

+1

-1 sorusu çerçevede gösterilmemesini istedi –

+2

@FireCrow Nasıl olsa da çerçeveler iyi bir fikir gibi görünüyor. Bu gerçekten bir çerçeve yolu tavsiye etmiyor. – JeromeJ

22
body= '' # b'' for consistency on Python 3.0 
try: 
    length= int(environ.get('CONTENT_LENGTH', '0')) 
except ValueError: 
    length= 0 
if length!=0: 
    body= environ['wsgi.input'].read(length) 

Not dönüştürülmemiş (veya 2to3d edilmiş, ancak düzgün test edilmedi). (Wsgiref.simple_server bile çalışmayacak.) Bugün 3.0'da WSGI yapmak zor bir zamandasınız.

+0

Evet Wsgiref'in işe gelmesiyle ilgili sorunlar yaşadım. Yamayı tamamladım. –

+0

http://www.python.org/dev/peps/pep-3333/ Python için WSGI PEP 3. – JeromeJ

3

Bu (Python 3.0) benim için çalıştı:

import urllib.parse 

post_input = urllib.parse.parse_qs(environ['wsgi.input'].readline().decode(),True) 
1

Hatta daha kısa

l = int(env.get('CONTENT_LENGTH')) if env.get('CONTENT_LENGTH') else 0 
body = env['wsgi.input'].read(l) if l > 0 else '' 

Bu kod, üretimde çalışır.