2009-02-09 6 views
30

WSGI를 사용하여 POST 데이터에 액세스하는 방법을 알아낼 수 없습니다. wsgi.org 웹 사이트에서 예제를 시도했지만 제대로 작동하지 않았습니다. 지금 Python 3.0을 사용하고 있습니다. WSGI 프레임 워크는 내가 원하지 않는 방식으로 권장하지 마십시오.WSGI에서 POST 데이터 액세스

저는 이것을 fieldstorage 개체로 가져 오는 방법을 알고 싶습니다.

+0

FWIW, 현재까지는 Python 3.0에 대한 WSGI 사양이 없으므로 최종 사양 업데이트가 Python 3.0에 대해 말할 수있는 것을 구현하려는 anyones 시도와 호환되지 않을 수 있으므로 사용자가 수행하는 모든 작업이 낭비 될 수 있습니다 . WSGI 응용 프로그램의 경우 Python 2.X를 사용하는 것이 좋습니다. –

+6

@GrahamDumpleton 더 이상 : http://www.python.org/dev/peps/pep-3333/ (나를 조금 나중에 읽는 사람들을 오해하지 마세요. 시간도 절약하십시오) – JeromeJ

+2

@JermoeJ - 그는 2009 년에 댓글을 달았으며 2013 년에 답장을 보내고 있습니다. 그가 누군가를 속일 려하고 있다고 생각하지 마십시오. :) – Sam

답변

28

당신이 FieldStorage 객체로 바로 POST 데이터를 얻기 위해 노력하고 가정 :

# 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

파이썬 3.0에서는 작동하지 않습니다. 문자열 대신 바이트를 반환하는 wsgi.input에 문제가 있습니다. :(나는 파이썬 3.0에서 이것을하는 방법이 필요하다 ... –

+0

WSGI 처리기는 무엇을 사용하고 있는가? 내장 CGIHandler를 사용하면 나에게 잘 돌아 간다. 나는 "post.cgi"파일을 가지고있다. 내 로컬 서버 http://pastebin.com/f40849562 잘 실행 중 –

+0

어떤 io 클래스가 wsgi.input입니까? BufferedIOBase 인 경우 cgi를 TextIOWrapper로 래핑 할 수 있어야합니다. .FieldStorage가 사용할 수 있습니다. –

-1

예를 들어 프레임 워크에서 프레임 워크를 사용하는 방법을 살펴 보시기 바랍니다. (난 그냥 예로서이를 사용하여 임의의 하나 하나를 추천하고 있지 않다.) 여기

Werkzeug의 코드입니다 :

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

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

그것은 A의 호출 여기에 요약하기가 복잡하기 때문에 그렇게하지 않을 것입니다. WSGI 아직 파이썬 3.0 완전 지정하고, 인기 WSGI 인프라의 많은되지 않도록

+0

여전히 Python 3.0에서는 작동하지 않으며 그게 내가 찾고있는 것입니다. 어쨌든 고마워. –

+1

-1 질문 프레임 워크를 표시하지 말 것을 요청했습니다. –

+2

@FireCrow 프레임 워크가 좋은 아이디어 인 것처럼 보입니다. 이것은 실제로 프레임 워크 방식을 권고하는 것이 아닙니다. – 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) 

주 변환되지 않은 (또는 2to3d되었지만 제대로 테스트하지). (wsgiref.simple_server조차도 실행되지 않습니다.) 오늘 WSGI 3.0을하는 데 힘든 시간을 보냈습니다.

+0

그래, wsgiref가 작동하는 데 문제가있었습니다. 나는 패치를 구현했다. –

+0

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

3

이 (파이썬 3.0에서) 나를 위해 일한 :

import urllib.parse 

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

비록 짧은

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

이 코드는 프로덕션 환경에서 작동합니다.