2010-03-22 1 views
28

BaseHTTPServer 모듈의 BaseHTTPHandler가 http 요청 매개 변수에 액세스하는 편리한 방법을 제공하지 않는 것 같습니다. 경로에서 GET 매개 변수와 요청 본문의 POST 매개 변수를 구문 분석하는 가장 좋은 방법은 무엇입니까?http GET 및 POST 매개 변수를 BaseHTTPHandler에서 구문 분석 하시겠습니까?

def do_GET(self): 
    parsed_path = urlparse.urlparse(self.path) 
    try: 
     params = dict([p.split('=') for p in parsed_path[4].split('&')]) 
    except: 
     params = {} 

이것은 대부분의 경우에 작동하지만 제대로 빈 매개 변수와 같은 인코딩 및 케이스를 처리하는 더 강력한 뭔가를 싶습니다

는 지금, 나는 GET이 사용하고 있습니다. 이상적으로는 전체 웹 프레임 워크가 아닌 작고 독립형을 원합니다.

답변

5

Werkzeug 모듈을 사용해보십시오. 기본 Werkzeug 라이브러리가 너무 크지 않으며 필요한 경우이 코드를 간단히 추출하면됩니다.

url_decode 방법은 MultiDict를 반환하고 인코딩 지원 :

urlparse.parse_qs 방법에 반대 WERKZEUG 버전을 담당으로

있습니다

  • 인코딩
  • 여러 값
  • 정렬 순서를

이것들을 (또는 인코딩의 경우에는 Python 3을 사용하여) 내장 된 솔루션을 자유롭게 사용할 수 있습니다.

2

CherryPy과 같은 라이브러리를 사용하여 조사한 적이 있습니까? BaseHTTPServer보다 이러한 작업을 처리하는 훨씬 더 빠른 경로를 제공합니다.

2

기본 HTTP 요청 매개 변수 지원은 CGI module에서 제공됩니다. 양식 데이터를 처리하는 데 권장되는 메커니즘은 cgi.FieldStorage 클래스입니다.

제출 된 양식 데이터를 얻으려면 FieldStorage 클래스를 사용하는 것이 가장 좋습니다. 이 모듈에서 정의 된 다른 클래스는 대부분 역방향 호환성을 위해 제공됩니다. 인수없이 정확히 한 번 인스턴스화하십시오. 이것은 표준 입력 또는 환경 (CGI 표준에 따라 설정된 다양한 환경 변수의 값에 따라)에서 양식 내용을 읽습니다. 표준 입력을 소비 할 수 있으므로 인스턴스화는 한 번만 수행해야합니다.

FieldStorage 인스턴스는 파이썬 사전과 같이 색인을 생성 할 수 있습니다. in 연산자를 사용하여 구성원 테스트를 수행 할 수 있으며 표준 사전 메서드 keys() 및 내장 함수 len()도 지원합니다. 빈 문자열을 포함하는 양식 필드는 무시되며 사전에 표시되지 않습니다. 이러한 값을 유지하려면 FieldStorage 인스턴스를 생성 할 때 선택적 keep_blank_values ​​키워드 매개 변수에 대한 실제 값을 제공하십시오.

form = cgi.FieldStorage() 
if "name" not in form or "addr" not in form: 
    print "<H1>Error</H1>" 
    print "Please fill in the name and addr fields." 
    return 
print "<p>name:", form["name"].value 
print "<p>addr:", form["addr"].value 
#...further form processing here... 
: 예를 들어

는 (컨텐츠 유형 헤더와 빈 줄은 이미 인쇄 된 것으로 가정) 다음 코드는 필드 이름과 요지가 모두 비어 있지 않은 문자열로 설정되어 있는지 확인

+0

적절한 urldecoding와 그것을 DICT를 구문 분석 -8)을 사용하면 사용 가능한 다른 라이브러리보다 적합하지 않습니다. – Wolph

+0

인코딩은 FieldStorage의 첫 번째 인수와 같은 파일 형식으로 위임 할 수 있습니다. – gimel

+0

사실,하지만 오류 잡기를 포함하여이 문제를 처리하는 스크립트가있을 때 왜 귀찮을까요? 바퀴를 재발 명할 필요가 없습니다. – Wolph

78

당신은 url.parse을 사용할 수 있습니다 :

>>> from url.parse import urlparse, parse_qs 
>>> url = 'http://example.com/?foo=bar&one=1' 
>>> parse_qs(urlparse(url).query) 
{'foo': ['bar'], 'one': ['1']} 

파이썬 2를 들어, 모듈은 urlparse 대신라는. 오래된 질문에

+2

파이썬 2의 urlparse는 인코딩을 처리하지 않으며, 파이썬 3 버전은이를 지원합니다. 또한, 올바른 순서를 유지하기 위해'parse_qsl' 대신에'parse_qs'가 사용되어야합니다. – Wolph

8

더 나은 솔루션 :

def do_POST(self): 
    length = int(self.headers.getheader('content-length')) 
    field_data = self.rfile.read(length) 
    fields = urlparse.parse_qs(field_data) 

이 문서 내용에서 urlencoded를 POST 데이터를 끌어와 UTF 같이합니다 (CGI 라이브러리 인코딩을 처리하지 않습니다

+0

파이썬에서 요청을 받고 게시 할 수있는 가장 기본적인 서버를 만들기 위해 노력 중이 었으며 POST 요청을 처리 할 때 나를 위해 일했습니다. 이것은 3 년 전에 작성되었지만 감사합니다! :) – harkirat1892