1.4. IMS Basic Learning Tools Interoperability (version 1.0)

The IMS Basic Learning Tools Interoperability (BLTI) specification was released in 2010. The purpose of the specification is to provide a link between tool consumers (such as Learning Management Systems and portals) and Tools (such as specialist assessment management systems). Official information about the specification is available from the IMS GLC: http://www.imsglobal.org/lti/

This module requires the oauth module to be installed. The oauth module is available from http://pypi.python.org/pypi/oauth/1.0.1

This module is written from the point of view of the Tool Provider. Consumers are modeled by the BLTIConsumer class which does nothing more than implement the recommended algorithm for checking the Nonces as recommended in the specification.

Typical usage would be in an HTTP request handler, this code is modelled on the code provided with the oauth module:

import pyslet.imsbltiv1p0 as blti

class BLTIRequestHandler(BaseHTTPRequestHandler):
        def __init__(self, *args, **kwargs):
                self.tp=blti.BLTIToolProvider()
                self.tp.LoadFromFile(open('consumers.txt'))
                BaseHTTPRequestHandler.__init__(self, *args, **kwargs)

        def do_GET(self):
                postdata = None
                if self.command=='POST':
                        try:
                                length = int(self.headers.getheader('content-length'))
                                postdata = self.rfile.read(length)
                        except:
                                pass
                parts=urlparse.urlsplit(self.path)
                if not parts.scheme:
                        scheme='http' # change here for https
                        if not parts.netloc:
                                netloc=self.headers['Host']
                        else:
                                netloc=parts.netloc
                        url=urlparse.urlunsplit([scheme,netloc]+list(parts[2:]))
                else:
                        url=self.path
                try:
                        consumer,params=self.tp.Launch(self.command, url, headers=self.headers, query_string=postdata)
                        self.ReturnPage("LTI Provider authorized request with parameters: \n%s"%str(params))
                except blti.BLTIOAuthParameterError:
                        self.ReturnUnauthorized("Missing or incomplete authentication parameters in request")
                except blti.BLTIAuthenticationError, err:
                        self.ReturnUnauhtorized("Access denied: "+str(err))
                return

        def do_POST(self):
                return self.do_GET()

        def ReturnPage(self,msg):
                self.send_response(200,'OK')
                self.send_header('Content-Type','text/plain')
                self.send_header('Content-Length',str(len(msg)))
                self.end_headers()
                self.wfile.write(msg)

        def ReturnUnauthorized(self,msg):
                self.send_response(403,"Unauthorized")
                self.end_headers()
                self.wfile.write(msg)

1.4.1. Reference

class pyslet.imsbltiv1p0.BLTIError

Bases: exceptions.Exception

Base class for BLTI errors.

class pyslet.imsbltiv1p0.BLTIAuthenticationError

Bases: pyslet.imsbltiv1p0.BLTIError

Error raised when a launch request cannot be authorized.