Skip to main content

Django-MOJO

The full-stack Django framework for teams that want to ship, not assemble.

Website & Documentation →


Most Django projects end up wiring together the same set of packages: a REST layer, an auth system, a job queue, a WebSocket server, a file store, a secrets manager, a metrics backend. Each one has its own conventions, its own config, its own failure modes — and none of them know about each other.

Django-MOJO ships all of that pre-integrated, with consistent patterns throughout. Define your models, configure permissions, and you have a production-grade API. The rest is already there when you need it.


What You Get

You used to wire up... Django-MOJO ships...
DRF + serializers + viewsets Model-first REST with RestMeta — permissions, graphs, filtering, pagination built in
SimpleJWT + django-allauth + MFA library Complete auth stack: JWT, OAuth, TOTP, passkeys, API keys, device management, session control
Channels + custom routing WebSocket pub/sub realtime — same auth as HTTP, topic-based, zero extra config
Celery + Redis Async job queue with scheduling, retries, heartbeat, and a web API
django-storages + custom S3 wrappers File upload, S3 backend, renditions, and an encrypted file vault
python-decouple + HashiCorp Vault DB-backed encrypted settings — secrets stay out of your repo, update without restart
structlog + Sentry + custom alerting Request logging, security incident tracking, and alerting baked into the request cycle
InfluxDB client or custom Redis counters Redis-backed time-series metrics with group-scoped rollups
Twilio SDK + phone number logic PhoneHub — SMS sending, phone normalization, test-number shortcuts

Install

pip install django-mojo

Quick Start

1. Define your model:

from django.db import models
from mojo.models import MojoModel

class Article(models.Model, MojoModel):
    title = models.CharField(max_length=200)
    body = models.TextField()
    author = models.ForeignKey("account.User", on_delete=models.CASCADE)
    is_published = models.BooleanField(default=False)

    class RestMeta:
        VIEW_PERMS = ["view_articles"]
        SAVE_PERMS = ["manage_articles"]
        LIST_DEFAULT_FILTERS = {"is_published": True}
        GRAPHS = {
            "default": {"fields": ["id", "title", "created"]},
            "detail":  {"fields": ["id", "title", "body", "author", "created"]},
        }

LIST_DEFAULT_FILTERS is a baseline, not a cage — a caller naming the same field (?is_published=false) or passing ?_no_defaults=1 sees the rest. See Default list filters.

2. Expose it as a REST endpoint:

from mojo import decorators as md
from .models.article import Article

@md.URL('article')
@md.uses_model_security(Article)
def on_article(request, pk=None):
    return Article.on_rest_request(request, pk)

That's it. You now have list, retrieve, create, update, and delete — with object-level permissions, graph-controlled output, filtering, pagination, and auth — all from two files.


Authentication Out of the Box

Django-MOJO ships a complete auth stack. Nothing to install or wire up separately.

  • JWT — access + refresh tokens, configurable TTLs, device-aware
  • OAuth — Google, Apple, and extensible to any provider
  • TOTP — authenticator apps, backup codes, recovery flow
  • Passkeys — WebAuthn discoverable credentials
  • API Keys — per-user, revocable, scoped
  • Sessions — list and revoke active sessions
  • Security events — login history, suspicious activity, lockout guard
# Login — returns JWT access + refresh tokens
POST /api/account/login
{"username": "user@example.com", "password": "..."}

# All auth flows use the same bearer token middleware
Authorization: Bearer <token>

Secure Settings

Secrets belong in the database, not in your repo. Django-MOJO's settings helper reads from a lookup chain: Redis cache → DB (group-scoped → global) → Django file settings.

from mojo.helpers.settings import settings

# Static config — read from file, safe at import time
HEADER = settings.get_static("DUID_HEADER", "x-mojo-duid")

# Dynamic secrets — read from DB/Redis at call time
def send_sms(to, body):
    sid   = settings.get("TWILIO_ACCOUNT_SID", kind="str")
    token = settings.get("TWILIO_AUTH_TOKEN",  kind="str")
    ...

DB-backed settings activate automatically once Django is ready — no manual flag, no restart required to pick up changes.


Async Jobs

from mojo.apps.jobs import queue_job

# Queue a background task
queue_job("send_welcome_email", user_id=user.pk)

# Define the handler
from mojo.apps.jobs import job_handler

@job_handler("send_welcome_email")
def handle_welcome_email(job):
    user = User.objects.get(pk=job.data["user_id"])
    ...

Built-in: priority channels, retries with backoff, idempotency keys, scheduled jobs, worker heartbeat, and a REST API for job status.


Realtime WebSockets

# Client subscribes to a topic
ws.send({"action": "subscribe", "topic": "user:123"})

# Server pushes to a topic from anywhere
from mojo.apps.realtime import publish
publish("user:123", {"type": "notification", "message": "You have a new message"})

Same JWT authentication as HTTP. No extra config.


Project Layout

mojo/
├── apps/
│   ├── account/     # Users, groups, auth (JWT, OAuth, TOTP, passkeys, API keys)
│   ├── jobs/        # Async job queue and scheduler
│   ├── realtime/    # WebSocket pub/sub (Django Channels)
│   ├── fileman/     # File upload, S3 backend, renditions
│   ├── filevault/   # Encrypted file vault
│   ├── logit/       # Request + database logging
│   ├── incident/    # Security incident tracking and alerting
│   ├── metrics/     # Redis-backed time-series metrics
│   ├── phonehub/    # SMS and phone number management
│   ├── shortlink/   # URL shortening
│   ├── docit/       # Wiki and documentation pages
│   └── aws/         # SES email, SNS, S3 helpers
├── helpers/
│   ├── settings/    # DB-backed settings with encryption
│   ├── crypto/      # Signing, hashing, token generation
│   ├── logit/       # Structured logging
│   ├── geoip/       # IP geolocation and threat detection
│   ├── content_guard/ # Deterministic content moderation
│   └── ...          # dates, redis, request, response, paths, and more
├── middleware/      # CORS, auth, request logging
├── models/          # MojoModel, RestMeta base classes
├── serializers/     # Serialization engine and cache
└── rest/            # OpenAPI, decorators, routing

Documentation

Docs are organized by audience and optimized for both human developers and AI coding assistants.

Django Developer Reference

For developers building applications with Django-MOJO.

Section Description
Core MojoModel, REST framework, decorators, middleware, serialization
Helpers logit, dates, settings, crypto, request, redis, and other utilities
Account User, Group, JWT auth, OAuth, TOTP, passkeys, API keys, sessions
Logging Database logging, security incidents
Fileman File upload, storage backends, renditions
Email AWS SES email, templates, inbound handling
Jobs Async task queue
Metrics Redis-backed time-series metrics
Realtime WebSocket pub/sub
PhoneHub Phone number management and SMS
FileVault Encrypted file vault
DocIt Documentation and wiki system

REST API Reference

For frontend and mobile developers integrating with Django-MOJO APIs.

Section Description
Core Authentication, request format, filtering, pagination, graphs
Account Login, users, groups, API keys
Logging Log queries, incident management
Fileman File uploads and downloads
Email Templates, mailboxes
Jobs Job status
Metrics Time-series metrics
Realtime WebSocket protocol
PhoneHub Phone lookup and normalization
FileVault Encrypted file vault
DocIt Documentation pages

Migrating from django-nativemojo

If you currently have django-nativemojo installed, switch with no code changes — your imports are unchanged.

pip uninstall django-nativemojo
pip install django-mojo

The old package name remains available as a compatibility shim for existing deployments.


Contributing

Pull requests and issues are welcome. Contributions should follow the Developer Guide and keep to the framework's philosophy: explicit over magic, secure by default, conventions over configuration.


License

Licensed under the MIT License. See LICENSE for details.

Release files for django-mojo 1.24.21

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-mojo 1.24.21
File Size Uploaded
django_mojo-1.24.21.tar.gz 7.9 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-mojo 1.24.21
File Interpreter ABI Platform
django_mojo-1.24.21-py3-none-any.whl Python 3 none any Details

Total release size: 12.3 MB

Release files / django_mojo-1.24.21.tar.gz

Download URL django_mojo-1.24.21.tar.gz
Size 7.9 MB
Tags Source
SHA-256 checksum
How to use checksums
22ec2425d743ad7e06d8225592c74205f33ee6e0d9abd98189ce9455c640fd20
BLAKE2b-256 checksum
How to use checksums
59d7b7c914a3a523ac303f89814355807ff5ef7651beb88f5823597cc904204d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / django_mojo-1.24.21-py3-none-any.whl

Download URL django_mojo-1.24.21-py3-none-any.whl
Size 4.4 MB
Tags Python 3
SHA-256 checksum
How to use checksums
217d51c1ceff7dec874cd4ceac983da5843db54a1bad0c6ffd95d98e1dd04ec7
BLAKE2b-256 checksum
How to use checksums
814bc59882431cfde40c8fc78bad8ac8d3fea3997ec55830db97f5f11a637a72
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

1.29.1

2 release files

1.29.0

2 release files

1.28.3

2 release files

1.28.2

2 release files

1.28.1

2 release files

1.28.0

2 release files

1.27.1

2 release files

1.27.0

2 release files

1.26.0

2 release files

1.25.3

2 release files

1.25.2

2 release files

1.25.1

2 release files

1.25.0

2 release files

This release

1.24.21 This release

2 release files

1.24.9

2 release files

1.24.8

2 release files

1.21.2

2 release files

1.21.1

2 release files

1.21.0

2 release files

1.20.1

2 release files

1.20.0

2 release files

1.19.2

2 release files

1.19.1

2 release files

1.19.0

2 release files

1.18.3

2 release files

1.18.2

2 release files

1.18.1

2 release files

1.18.0

2 release files

1.17.1

2 release files

1.17.0

2 release files

1.16.2

2 release files

1.16.1

2 release files

1.16.0

2 release files

1.15.9

2 release files

1.15.8

2 release files

1.15.7

2 release files

1.15.6

2 release files

1.15.5

2 release files

1.15.4

2 release files

1.15.3

2 release files

1.15.2

2 release files

1.15.1

2 release files

1.15.0

2 release files

1.14.0

2 release files

1.13.0

2 release files

1.12.4

2 release files

1.12.3

2 release files

1.12.2

2 release files

1.12.1

2 release files

1.12.0

2 release files

1.11.9

2 release files

1.11.8

2 release files

1.11.7

2 release files

1.11.6

2 release files

1.11.5

2 release files

1.11.4

2 release files

1.11.3

2 release files

1.11.2

2 release files

1.11.1

2 release files

1.11.0

2 release files

1.10.2

2 release files

1.10.1

2 release files

1.10.0

2 release files

1.9.0

2 release files

1.8.2

2 release files

1.8.1

2 release files

1.8.0

2 release files

1.7.1

2 release files

1.7.0

2 release files

1.6.0

2 release files

1.5.1

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.64

2 release files

1.2.63

2 release files

1.2.62

2 release files

1.2.61

2 release files

1.2.60

2 release files

1.2.59

2 release files

1.2.58

2 release files

1.2.56

2 release files

1.2.55

2 release files

1.2.54

2 release files

1.2.53

2 release files

1.2.52

2 release files

1.2.51

2 release files

1.2.50

2 release files

1.2.49

2 release files

1.2.48

2 release files

1.2.47

2 release files

1.2.46

2 release files

1.2.45

2 release files

1.2.38

2 release files

1.2.37

2 release files

1.2.36

2 release files

1.2.32

2 release files

1.2.31

2 release files

1.2.30

2 release files

1.2.29

2 release files

1.2.28

2 release files

1.2.27

2 release files

1.2.26

2 release files

1.2.25

2 release files

1.2.24

2 release files

1.2.23

2 release files

1.2.22

2 release files

1.2.21

2 release files

1.2.20

2 release files

1.2.19

2 release files

1.2.18

2 release files

1.2.17

2 release files

1.2.16

2 release files

1.2.15

2 release files

1.2.13

2 release files

1.2.12

2 release files

1.2.11

2 release files

1.2.10

2 release files

1.2.9

2 release files

1.2.8

2 release files

1.2.7

2 release files

1.2.6

2 release files

1.2.5

2 release files

1.2.4

2 release files

1.2.3

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.1.34

2 release files

1.1.33

2 release files

1.1.32

2 release files

1.1.31

2 release files

1.1.30

2 release files

1.1.29

2 release files

1.1.28

2 release files

1.1.27

2 release files

1.1.26

2 release files

1.1.25

2 release files

1.1.24

2 release files

1.1.23

2 release files

1.1.22

2 release files

1.1.21

2 release files

1.1.20

2 release files

1.1.19

2 release files

1.1.9

2 release files

1.1.8

2 release files

1.1.7

2 release files

1.1.6

2 release files

1.1.5

2 release files

1.1.4

2 release files

1.1.3

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.0.80

2 release files

1.0.79

2 release files

1.0.78

2 release files

1.0.77

2 release files

1.0.76

2 release files

1.0.75

2 release files

1.0.74

2 release files

1.0.73

2 release files

1.0.72

2 release files

1.0.71

2 release files

1.0.70

2 release files

1.0.69

2 release files

1.0.68

2 release files

1.0.67

2 release files

1.0.66

2 release files

1.0.65

2 release files

1.0.61

2 release files

1.0.60

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page