nanodjango
- Write a Django site in a single file, using views, models and admin
- Run it locally or in production, or share it as a standalone script
- Automatically convert it to a full Django project when you're ready for it to grow
- Try it out in your browser at the nanodjango playground
Head to nanodjango.dev to get a high level overview of what nanodjango can do, or you may like to watch a lighting talk.
Quickstart
Install nanodjango:
pip install nanodjango
Write your app in single .py file - for example:
from django.db import models
from nanodjango import Django
app = Django()
@app.admin
class CountLog(models.Model):
# Standard Django model, registered with the admin site
timestamp = models.DateTimeField(auto_now_add=True)
@app.route("/")
def count(request):
# Standard Django function view, or class-based view
CountLog.objects.create()
return f"<p>Number of page loads: {CountLog.objects.count()}</p>"
@app.api.get("/add")
def add(request):
# Django Ninja API support built in
CountLog.objects.create()
return {"count": CountLog.objects.count()}
@app.route("/slow/")
async def slow(request):
import asyncio
await asyncio.sleep(10)
return "Async views supported"
Save that as counter.py, then set it up and run it:
nanodjango run counter.py
This will create migrations and a database, and run your project in development mode.
- See Command usage for more options
Convert it to a full site
If your project outgrows its single file, you can convert it into a full Django site:
nanodjango convert counter.py path/to/site --name=counter
- See Converting to a full Django project for more information
Share an app
Nanodjango apps are great for sharing examples and prototypes.
Add inline script metadata at the top with your dependencies:
# /// script
# dependencies = ["nanodjango"]
# ///
and call app.run() at the bottom:
if __name__ == "__main__":
app.run()
Now your app can be run without installing anything, using uv or pipx:
# Run with uv
uv run ./script.py
# or with pipx
pipx run ./script.py
You can still manually install dependencies and run the script directly with Python:
pip install nanodjango
python script.py
Run management commands
Anything you would normally do with manage.py you can do with nanodjango manage:
nanodjango manage script.py check
nanodjango manage script.py makemigrations script
nanodjango manage script.py runserver 0.0.0.0:8000
Run in production
To run nanodjango with production defaults, use nanodjango serve:
nanodjango serve counter.py
This will use gunicorn, or uvicorn if you have async views. It will also turn off
settings.DEBUG, and will not serve media files.
Alternatively, you can pass the app directly to a WSGI or ASGI server if you prefer:
gunicorn -w 4 counter:app
uvicorn counter:app
- See Command usage for more options
Further reading
For more details, see
Release files for nanodjango 0.16.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| nanodjango-0.16.4.tar.gz | 62.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| nanodjango-0.16.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 119.3 kB
Release files / nanodjango-0.16.4.tar.gz
| Download URL | nanodjango-0.16.4.tar.gz |
|---|---|
| Size | 62.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1ce5365c090799bbec6723b4efe91efd0ef1033a6c654b6af67d0e044ece2adb
|
|
BLAKE2b-256 checksum How to use checksums |
ebb46d66ad4c96d7ff7bda8a4e57da811fef679c1c10dc1f7673654535d61848
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 24, 2026.
Transparency logRelease files / nanodjango-0.16.4-py3-none-any.whl
| Download URL | nanodjango-0.16.4-py3-none-any.whl |
|---|---|
| Size | 56.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a66eea211bb33986dc2b5b23741898c2875eccdef1831173dabc52219d79e104
|
|
BLAKE2b-256 checksum How to use checksums |
51b10cb4f124eee581f49e55b6f779aab097c4852ba408fc9607f6190289c129
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 24, 2026.
Transparency log