2012-01-19 13 views
13

Basit bir HTTP istemcisi ve python'da sunucu için sunucuya yazdım. Aşağıdaki ilk kod parçacığı, bir imi ile bir HTTP alma isteğini nasıl gönderdiğimi gösterir. İkinci kod snippet'inde sunucu tarafındaki doGet işlev uygulamamı gösteriyorum. Sorum şu ki, sunucu kodundaki imsi parametresini nasıl çıkarabileceğim ve müşteriye imsi'nin geçerli olduğunu bildirmek için müşteriye bir cevap gönderebiliyorum. Teşekkürler.Python'da sunucu tarafında HTTP GET giriş parametresi işleniyor

P.S .: İstemcinin isteği başarıyla gönderdiği doğrulandı.

MÜŞTERİ kod parçacığı

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

Sen urlparse kullanarak bir GET isteğinin sorgu ayrıştırabilir

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" isteği ile gönderilen 'args' almıyor musunuz? – aayoubi

+0

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

cevap

23

SUNUCU kod parçacığı, daha sonra sorgu dizesi bölün.

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"] } 

Bayağı düşük seviyeli sunucusu

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

& shell özel bir karakter ... Curl komutunuz her ikisinden de geçecek şekilde kaçması gerekiyor –

+0

params tabii ki, =) –

+1

Python 3 ile, urllib.parse import urlparse 'kaynağından yararlanın kaynak: https://stackoverflow.com/a/5239594/4669135 –

9

BaseHTTPServer edilir kullanarak bu onaylayabilir. Genel olarak, bu tür bir aldatmacayı sizin için yapan gerçek bir web çerçevesi kullanmak istersiniz, ancak siz sorduğunuzdan beri ...

İlk olarak bir URL ayrıştırma kütüphanesi içe aktarın. Python 2'de x urlparse'dur. sorgu dizesini ayrıştırmak, sizin do_get yönteminde,

import urlparse 

Sonra (Python3 olarak, urllib.parse kullanmayı tercih ediyorum).

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

Ayrıca, istemci kodu urllib kullanıyor olabilir ve muhtemelen çok daha kolay olurdu.

0

cgi modülü, CGI bağlamında kullanılması gereken, ancak içeriğinizde de kolayca kullanıldığı görülen FieldStorage sınıfını içerir.

İlgili konular