PyLTI1p3
LTI 1.3 Advantage Tool implementation in Python
What it is and what it does
PyLTI1p3 is a Python library that implements the LTI 1.3 Advantage standard, allowing you to build learning tools that integrate with educational platforms like Canvas. It handles the two-step LTI launch flow: first an OIDC login request to the platform, then a signed message launch back to your tool. The library provides ready-made adapters for Django and Flask, abstracting away the cryptographic validation and OIDC protocol details.
You configure the tool with issuer settings (auth endpoints, keys, deployment IDs) either via JSON files, Python dictionaries, or—in Django—via the admin UI. Once configured, you instantiate OIDCLogin or MessageLaunch objects bound to the incoming request, call redirect() or get_launch_data(), and the library handles JWT validation, key fetching, and claim extraction. It also provides convenience methods to check launch type and access to LTI services like Assignments & Grades and Names & Roles.
Use it for:
- Build a custom learning tool that launches from Canvas or other LTI-compliant platforms with automatic user authentication.
- Integrate grade passback and assignment submission handling via LTI Advantage services without implementing the protocol yourself.
- Deploy the same tool across multiple LMS instances by configuring multiple issuers and client IDs in a single application.
- Validate and extract user/course context from LTI launch messages to personalize tool behavior per institution.
- Implement deep linking to allow instructors to select and embed tool content directly into course materials.
Worth the install?
AI-flagged interpretation of the facts on this page — verify before relying
Implements the LTI 1.3 Advantage specification for Python web applications, providing OIDC login and message launch handling with built-in adapters for Django and Flask.
Yes, if you are building an LTI 1.3 tool for Django or Flask and can accept dormant maintenance. The library is production-stable, has no known vulnerabilities, and handles the complex LTI protocol correctly. However, verify compatibility with your target LMS versions and be prepared to fork or patch if critical issues arise post-2022, since the original maintainer is not actively releasing updates.
Install
pylti1p3 on PyPI
pip
pip install pylti1p3uv
uv add pylti1p3poetry
poetry add pylti1p3Installing PyLTI1p3
Before you install
Low install friction with only four runtime dependencies (jwcrypto, pyjwt, requests, typing-extensions). However, the package is dormant—last release was 2022-11-20 and last commit 2024-08-18—so it receives no active maintenance despite being marked Production/Stable.
License in practice
MIT license (permissive) means you can use, modify, and distribute this package freely in commercial and private projects with minimal restrictions.
Quickstart
# Install
pip install PyLTI1p3
# Django example
from pylti1p3.contrib.django import DjangoOIDCLogin, DjangoMessageLaunch
from pylti1p3.tool_config import ToolConfDict
tool_conf = ToolConfDict(settings)
oidc_login = DjangoOIDCLogin(request, tool_conf)
oidc_login.redirect(launch_url)
message_launch = DjangoMessageLaunch(request, tool_conf)
launch_data = message_launch.get_launch_data()
Requires Django or Flask web framework; LTI platform must be pre-configured with tool's public/private keys and deployment IDs.
Verify before relying
- Whether the package works with LMS platforms released after 2022-11-20 without issues.
- Current compatibility with Python 3.12+ (classifiers list only up to 3.11).
- Whether dormant status means security patches will be applied if vulnerabilities are discovered.
Package facts
| License | MIT (permissive) |
| Python support | not specified |
| Install friction | low — pure-Python wheel |
| Runtime dependencies | 4 — jwcrypto, pyjwt, requests, typing-extensions |
| Maintenance | dormant — 1,363 days since the last release |
| Last repo commit | |
| First released | |
| Downloads | 189,876/month — #9,921 on PyPI (30-day window, as of 2026-08-14) |
| Known vulnerabilities | none known (OSV.dev, checked 2026-08-14) |
Evidence: PyLTI1p3-2.0.0-py2.py3-none-any.whl
Keywords: pylti, pylti1p3, lti, lti1.3, lti1p3, django, flask
Tags
More Python Modules packages
Converts domain names between Unicode and…
permissive · top 100 on PyPI
setuptoolsSetuptools is a Python build backend and…
permissive · top 100 on PyPI
PyYAMLPyYAML parses and emits YAML 1.1 data format,…
permissive · top 100 on PyPI
pydanticPydantic validates Python data structures…
permissive · top 100 on PyPI
annotated-typesProvides reusable metadata objects for use with…
permissive · top 100 on PyPI
typing-inspectionProvides runtime tools to inspect and…
permissive · top 100 on PyPI
flask-oidcAdds OpenID Connect authentication support to…
permissive · top 5,000 on PyPI
Flask-OpenIDAdds OpenID authentication support to Flask web…
permissive · top 5,000 on PyPI
django-oidc-providerProvides OpenID Connect and OAuth 2.0 server…
permissive · top 15,000 on PyPI
mozilla-django-oidcIntegrates Django applications with OpenID…
copyleft · top 5,000 on PyPI
AuthlibAuthlib provides a complete implementation of…
permissive · top 1,000 on PyPI
Flask-DanceFlask-Dance simplifies OAuth authentication in…
permissive · top 5,000 on PyPI
identityProvides a high-level authentication and…
permissive · top 15,000 on PyPI
uipath-llm-clientA Python client for accessing LLMs through…
unclear · top 5,000 on PyPI
dash-authAdds HTTP Basic Authentication and OpenID…
permissive · top 15,000 on PyPI
axioms-fastapiAdds OAuth2/OIDC JWT token validation and…
permissive · top 15,000 on PyPI