2012-01-19 5 views
13

간단한 HTTP 클라이언트와 서버를 파이썬으로 작성했습니다. 아래의 첫 번째 코드 스 니펫은 imsi 매개 변수와 함께 HTTP get 요청을 보내는 방법을 보여줍니다. 두 번째 코드 스 니펫에서는 서버 측에서 doGet 함수 구현을 보여줍니다. 내 질문은 서버 코드에서 imsi 매개 변수를 추출하여 클라이언트에게 응답을 보내어 imsi가 유효하다는 클라이언트에 신호를 보내는 방법입니다. 감사.서버 측에서 HTTP GET 입력 매개 변수를 파이썬에서 처리합니다.

P .: 클라이언트가 요청을 성공적으로 전송했음을 확인했습니다.

클라이언트 코드

params = urllib.urlencode({'imsi': str(imsi)}) 
    conn = httplib.HTTPConnection(host + ':' + str(port)) 
    #conn.set_debuglevel(1) 
    conn.request("GET", "/index.htm", 'imsi=' + str(imsi)) 
    r = conn.getresponse() 

당신은 urlparse 사용하여 GET 요청의 쿼리를 구문 분석 할 수

import sys, string,cStringIO, cgi,time,datetime 
from os import curdir, sep 
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 

class MyHandler(BaseHTTPRequestHandler): 

# I WANT TO EXTRACT imsi parameter here and send a success response to 
# back to the client. 
def do_GET(self): 
    try: 
     if self.path.endswith(".html"): 
      #self.path has /index.htm 
      f = open(curdir + sep + self.path) 
      self.send_response(200) 
      self.send_header('Content-type','text/html') 
      self.end_headers() 
      self.wfile.write("<h1>Device Static Content</h1>") 
      self.wfile.write(f.read()) 
      f.close() 
      return 
     if self.path.endswith(".esp"): #our dynamic content 
      self.send_response(200) 
      self.send_header('Content-type','text/html') 
      self.end_headers() 
      self.wfile.write("<h1>Dynamic Dynamic Content</h1>") 
      self.wfile.write("Today is the " + str(time.localtime()[7])) 
      self.wfile.write(" day in the year " + str(time.localtime()[0])) 
      return 

     # The root 
     self.send_response(200) 
     self.send_header('Content-type','text/html') 
     self.end_headers() 

     lst = list(sys.argv[1]) 
     n = lst[len(lst) - 1] 
     now = datetime.datetime.now() 

     output = cStringIO.StringIO() 
     output.write("<html><head>") 
     output.write("<style type=\"text/css\">") 
     output.write("h1 {color:blue;}") 
     output.write("h2 {color:red;}") 
     output.write("</style>") 
     output.write("<h1>Device #" + n + " Root Content</h1>") 
     output.write("<h2>Device Addr: " + sys.argv[1] + ":" + sys.argv[2] + "</h1>") 
     output.write("<h2>Device Time: " + now.strftime("%Y-%m-%d %H:%M:%S") + "</h2>") 
     output.write("</body>") 
     output.write("</html>") 

     self.wfile.write(output.getvalue()) 

     return 

    except IOError: 
     self.send_error(404,'File Not Found: %s' % self.path) 
+0

'GET '요청과 함께'args'를 보내지 않으셨습니까? – aayoubi

+0

관련 : https://stackoverflow.com/questions/2490162/parse-http-get-and-post-parameters-from-basehttphandler –

답변

23

서버 코드는 다음 쿼리 문자열을 분할합니다.

from urlparse import urlparse 
query = urlparse(self.path).query 
query_components = dict(qc.split("=") for qc in query.split("&")) 
imsi = query_components["imsi"] 
# query_components = { "imsi" : "Hello" } 

# Or use the parse_qs method 
from urlparse import urlparse, parse_qs 
query_components = parse_qs(urlparse(self.path).query) 
imsi = query_components["imsi"] 
# query_components = { "imsi" : ["Hello"] } 

당신은 매우 낮은 수준의 서버를

curl http://your.host/?imsi=Hello 
+1

&는 쉘 특수 문자입니다. curl 명령이 이스케이프 처리되므로 두 명령을 모두 통과해야합니다. params –

+0

아, 물론 그 점을 발견해 주셔서 감사합니다.) –

+1

Python 3에서'from urllib.parse import urlparse' 소스를 사용하십시오 : https://stackoverflow.com/a/5239594/4669135 –

9

BaseHTTPServer이다 사용하여이를 확인할 수 있습니다. 일반적으로 당신은 이런 종류의 꿀꿀 거리는 일을하는 실제 웹 프레임 워크를 사용하고 싶습니다.하지만 물어봤을 때 ...

먼저 URL 구문 분석 라이브러리를 가져옵니다. 파이썬 2에서는 x가 urlparse입니다. 쿼리 문자열을 구문 분석, 당신의 do_get 방법에

import urlparse 

다음 (Python3에서는 urllib.parse을 사용하십시오).

imsi = urlparse.parse_qs(urlparse.urlparse(self.path).query).get('imsi', None) 
print imsi # Prints None or the string value of imsi 

또한, 당신은 당신의 클라이언트 코드에 urllib를 사용 할 수 있고 아마 훨씬 쉽게 될 것입니다.

0

cgi 모듈에는 CGI 컨텍스트에서 사용되는 것으로 가정되는 FieldStorage 클래스가 들어 있지만 사용자 컨텍스트에서도 쉽게 사용되는 것으로 보입니다.

관련 문제