Package: launchkey-twisted
OverviewThe LaunchKey Twisted library allows for asynchronous communication with the LaunchKey Engine API
via a Python library and Twisted. The public interface is the same as thesynchronous SDKwith the two exceptions:The first argument of the init script for launchkey_twisted.TwistedAPI is aTwisted Web Client Agent.All public methods returnTwisted Deferredobjects.Installation$easy_installlaunchkey-twistedor$pipinstalllaunchkey-twistedThe following example is a functional representation of a simple session based launch request and subsequent
de-orbit if applicable.The use of polling is not suggested for production server based implementations.importsysfromtwisted.pythonimportlogfromtwisted.internetimporttask,reactor,deferfromtwisted.web.clientimportAgentfromlaunchkey_twistedimportTwistedAPI,PendingResponse# agent is needed to link the SDK to the reactor as an HTTP clientagent=Agent(reactor)# app_key will be provided in the dashboardapp_key=1234567890# app_secret will be provided in the dashboard once, or a new one may be generatedapp_secret="abcdefghijklmnopqrstuvwxyz123456"# private key location will will be the path to the private key file you received from the dashboard or the# private key file you used to generate the public key you uploaded to the dashboardprivate_key_location="/path/to/private.key"# Your LaunchKey usernameusername="myusername"# Poll interval determines the delay in seconds between poll requestspoll_interval=1.0# Log out delay determines the delay in seconds between an accepted authentication and logoutlog_out_delay=3.0# If you are having issues, set this to true for verbose logging onthe reactordebug=Falsedefhandle_auth_response(auth_request):"""
    Receives the auth_request identifier and begin the polling process
    :param auth_request: Identifier for this authentication request returned by the LaunchKey Engine API
    :return: Deferred
    """print("Authentication request successfully initiated with identifier:{0}".format(auth_request))returnpoll_for_user_repsonse(auth_request)defpoll_for_user_repsonse(auth_request):"""
    Schedule the next poll operation.   Adds callback for success and error situations
    :param auth_request: Identifier for this authentication request returned by the LaunchKey Engine API
    :return: Deferred
    """print("Poll for user response in{0}seconds".format(poll_interval))d=task.deferLater(reactor,poll_interval,api.poll_request,auth_request)d.addCallback(handle_poll_response,auth_request)d.addErrback(handle_poll_error)returnddefhandle_poll_error(failure):"""
    Trap PendingResponse errors and schedule another poll
    :param failure:
    :return: Deferred
    """failure.trap(PendingResponse)returnpoll_for_user_repsonse(failure.value.auth_request)defhandle_poll_response(response,auth_request):"""
    Receive the poll response and the original auth_request to validate the poll response package and detyermine the
    outcome.
    :param response: Poll response object
    :param auth_request: Identifier for this authentication request returned by the LaunchKey Engine API
    :return: Deferred
    """print("User response received, checking the response package")deferred=api.is_authorized(auth_request,response['auth'])deferred.addCallback(handle_is_authorized_response,auth_request)returndeferreddefhandle_is_authorized_response(authorized,auth_request):"""
    Receive the is_authorized response and schedule the logout if authorized
    :param authorized: Boolean value depicting the users response to the auth_request.
    (True: accepted | False: declined)
    :param auth_request: Identifier for this authentication request returned by the LaunchKey Engine API
    :return: Deferred
    """ifauthorized:print("User accepted, scheduling logout for{0}seconds from now".format(log_out_delay))deferred=task.deferLater(reactor,log_out_delay,log_user_out,auth_request)else:print("User declined")deferred=defer.succeed(True)returndeferreddeflog_user_out(auth_request):"""
    End the user session for the provided authentication request
    :param auth_request: Identifier for this authentication request returned by the LaunchKey Engine API
    :return: Deferred
    """print("Logging user out")deferred=api.logout(auth_request)deferred.addCallback(done)returndeferreddefhandle_error(failure):"""
    Print an error
    :param failure:
    :return:
    """print("Completed with error: ",failure)returnfailuredefdone(*args):"""
    Stop the reactor
    :param args:
    :return:
    """reactor.stop()print("Reactor stopped")agent=Agent(reactor)api=TwistedAPI(agent,app_key,app_secret,open(private_key_location,"r").read())print("Starting authentication request for user:{0}".format(username))auth=api.authorize(username,True)auth.addCallback(handle_auth_response)auth.addErrback(handle_error)auth.addBoth(done)ifdebug:log.startLogging(sys.stderr)print("Starting reactor")reactor.run()Tests$pythonsetup.pynosetestsContributingFork itCreate your feature branch (git checkout -b my-new-feature)Commit your changes (git commit -am ‘Add some feature’)Push to the branch (git push origin my-new-feature)Create new Pull Request