2013-10-31 80 views
1

我寫了一個簡單的類,它使用urllib和urllib2發送http請求並獲得響應。但是,使用其IP地址對本地主機的任何請求都非常緩慢。通過python urllib和urllib2在localhost上的HTTP請求非常慢

本地主機的IP地址是192.168.158.27 =

import urllib2,urllib,re,datetime,time 

class HTTPRequest(): 
    def __init__(self,**kargs): 
     self._response = None 
     self._buffer = None 
     self._conn = urllib2.build_opener(urllib2.HTTPCookieProcessor()) 
     urllib2.install_opener(self._conn) 

    def _encode_url(self,**kargs): 
     try: 
      params = urllib.urlencode(kargs) 
     except: 
      raise HTTPError("Failed to encode URL parameters..") 

     return str(params) 

    def _request(self,url=None,params=None): 
     try: 
      self._buffer = self._conn.open(url,params) 
      self._response = self._buffer.read() 
     except ValueError: 
      raise HTTPError("Invalid URL %s" % url) 
     except: 
      raise HTTPError("Failed to send HTTP(s) Request") 
     return str(self._response) 

class HTTPError(Exception): 
    pass 


PARAM_PASSWORD = 'password' 
PARAM_USER = 'userName' 
PARAM_ACTION = 'a' 
PARAM_RID = 'rid' 
PARAM_XO = 'xo' 
PARAM_START_TIME = 't1' 
PARAM_END_TIME = 't2' 
PARAM_PATH = 'path' 

BOOLEAN_TRUE = 'true' 
BOOLEAN_FALSE = 'false' 

ACTION_SIGNIN = 'signIn' 
ACTION_SEARCH = 'search' 
ACTION_GET_NEXT_RESULTS = 'getNextResults' 

STATUS_SUCCEEDED = 'succeeded' 

DEFAULT_WAIT = 5 

host = "192.168.158.27" 
user = "admin" 
password = "admin" 
protocol = "https" 
port = 8443 
query = "vm[=name rx (?i) *]&[@cpuUsage rx b .+][@cpuUsagemhz rx b .+]" 
start_time = "10/05/2013 16:16:00" 
end_time = "10/05/2013 17:16:00" 
base_url = "%s://%s:%d" % (protocol,host,port) 
login_url = "%s/user" % base_url 

http = HTTPRequest() 

attributes = {PARAM_PASSWORD : password, 
       PARAM_USER : user, 
       PARAM_ACTION : ACTION_SIGNIN, 
       PARAM_RID : 1000, 
       PARAM_XO : BOOLEAN_TRUE} 

params = http._encode_url(**attributes) 

if not http._request(login_url,params): 
     print "Login Failed.." 

else: 
     print "Login Successful.. \n" 



rid = 1000 

search_url = "%s/Search" % base_url 

status = STATUS_SUCCEEDED 
hasMoreData = BOOLEAN_TRUE 
completed = BOOLEAN_FALSE 
total = 0 
processed = 1 
responseContent = "" 
xml_dict = {} 
_response = "" 

attributes = {PARAM_START_TIME : start_time, 
       PARAM_END_TIME : end_time, 
       PARAM_ACTION : ACTION_SEARCH, 
       PARAM_RID : rid, 
       PARAM_PATH : query} 

print "URL PARAMETERS :" 
print "\tBase url = %s" % base_url 

for param in attributes: 
    print "\t%s = %s" % (param,attributes[param]) 

#Query Execution Start Time 
start = datetime.datetime.now() 

while True: 
    params = http._encode_url(**attributes) 
    if hasMoreData == BOOLEAN_TRUE: 
     #Delay 10ms 
     time.sleep(10/1000) 

     #Send HTTP Request 
     response = http._request(search_url,params) 

     pattern = re.match(".*?hasMoreData=\"(.*?)\".*?",response) 
     if pattern: 
      hasMoreData = pattern.group(1) 

     pattern = re.match(".*?status=\"(.*?)\".*?",response) 
     if pattern: 
      status = pattern.group(1) 

     pattern = re.match(".*?completed=\"(.*?)\".*?",response) 
     if pattern: 
      completed = pattern.group(1) 

     pattern = re.match(".*?processed=\"(.*?)\".*?",response) 
     if pattern: 
      processed = pattern.group(1) 

     pattern = re.match(".*?total=\"(.*?)\".*?",response) 
     if pattern: 
      total = pattern.group(1) 

     pattern = re.match(".*?matched=\"(.*?)\".*?",response) 
     if pattern: 
      matched = pattern.group(1) 

     attributes = {PARAM_ACTION : ACTION_GET_NEXT_RESULTS, 
         PARAM_RID : rid} 

     if matched != "0": 
      response = re.sub(r'\n',"",response) 
      matchObj = re.search(r'(<Resource.*</Resource>)',response) 

      resp_match = "" 
      if matchObj: 
       resp_match = matchObj.group(1) 

      responseContent = str(responseContent) + str(resp_match) 
    else: 
     #Query Execution Completed 
     #Query Execution End Time 
     end = datetime.datetime.now() 

     print "RESULTS : " 
     print "\tStatus = %s"%status 
     print "\tHas More Data = %s"%hasMoreData 
     print "\tCompleted = %s"%completed 
     print "\tProcessed = %s"%processed 
     print "\tTotal = %s"%total 
     print "\tMatched = %s"%matched 
     print "\nQuery Execution Started : %s" % start 
     print "Query Execution Ended : %s\n" % end 

     if total != processed: 
      err = "The number records processed did not match" 
      err += " with the number of records completed." 
      print err 

     if not status == STATUS_SUCCEEDED: 
      err = "The responce status is not 'succeeded'" 
      print err 

     if completed == BOOLEAN_FALSE: 
      err = "The repsponse is completed. " 
      err += "However, the flag is set to 'False'" 
      print err 
     break 
+0

嘗試'127.0.0.1'作爲您的本地主機 –

+0

您請求的IP在同一臺計算機上? – aIKid

回答

1

而不是你的本地網絡IP,請嘗試使用127.0.0.1代替。