, , . , , , ...
, , , , , - :
from twisted.internet import defer
from twisted.web import client
from twisted.python import log
from urllib import urlencode
import time
class APIException(Exception):
pass
class ASyncExampleClass(object):
def __init__(self):
self.session = None
self.token = None
@defer.inlineCallbacks
def api_call(self, api_method,tries=3,timeout=10):
attempt = 1
while attempt <= tries:
attempt += 1
if self.session = None:
yield sess_data = client.getPage("http://example.com/session/",timeout=timeout)
self.session = extractSessionFromData(sess_data)
if self.token = None:
yield token_data = client.getPage("http://example.com/token/?%s" % urlencode(dict(session=self.session)),timeout=timeout)
self.token = extractTokenFromData(token_data)
yield api_result = client.getPage("http://example.com/api/?%s" % urlencode(dict(api_method=api_method,session=self.session,token=self.token)),timeout=timeout)
if sessionInvalid(api_result):
log.msg("Request for %s failed because invalid session %s" % (api_method,self.session))
self.session = None
self.token = None
continue
if tokenInvalid(api_result):
log.msg("Request for %s failed because invalid token %s" % (api_method,self.token))
self.token = None
continue
returnValue(api_result)
break
else:
raise APIException("Tried and failed %s times to do %s" % (attempt - 1, api_method))
, api, inlineCallbacks . , , . , try/except HTTP-.
twisted.web.client.getPage POST, , , HTTPClientFactory.
, , .