Chapter 1 · What Django is

1.5 Where Django came from, and who makes it

Django began in 2003 at World Online, the web department of the Lawrence Journal-World newspaper in Lawrence, Kansas. A team of volunteers runs it under a steering council, with the Django Software Foundation beside them, and its larger changes go through Django Enhancement Proposals, which since 2018 have also reshaped how the project is governed. The project makes promises to those who build on it, about security and about stability.

A framework drawn from a newsroom

World Online, a newspaper’s web operation, built web applications on journalism’s deadlines, often with only hours to take a complicated one from concept to launch. In the autumn of 2003 its developers, Adrian Holovaty and Simon Willison, moved from PHP to Python, and as they built sites such as Lawrence.com they drew a general framework out of them, which they kept improving for two years. In the summer of 2005 World Online decided to release it as open source, as Django.

The name is that of Django Reinhardt, a jazz manouche guitarist of the 1930s to the early 1950s, and it is said JANG-oh, the D silent.

Django is distributed under the three-clause BSD licence, which grants broad permission to modify and redistribute it; its file LICENSE names the Django Software Foundation and the individual contributors as the holders of the copyright. Python’s licence stands beside it, because Django includes code from Python’s standard library.

The foundation and the project

The Django Software Foundation is a non-profit organization that handles the financial and legal matters of the Django project. The project itself is not a legal entity, and beyond money and law the foundation leaves it to run the framework’s development, its ecosystem and its community. The foundation appears in the project’s workings at fixed points; among them, it can fund the posts of the Django Fellows, and its board runs the elections of the steering council and ratifies their results.

Django Enhancement Proposals

A Django Enhancement Proposal, a DEP, is a design document that informs the community or describes a new feature or a process for Django, with a concise specification and the reasons for it. It is meant to be the project’s main means of proposing a major feature and of recording a design decision. DEP 1, which set up the process in 2014, was written by Adrian Holovaty and Jacob Kaplan-Moss and is, by its own account, a near-copy of Python’s PEP process. A DEP is submitted as a pull request to a separate repository, django/deps, and the steering council has the final word on it. The repository files each proposal under its state: draft, accepted, final once its implementation is in Django, withdrawn, rejected or superseded.

None of the documents that set the project’s rules says exactly which changes need a DEP. The governance defines a major change as one large enough to need a DEP, and a minor change as one that is not; DEP 1 adds that small enhancements and patches usually need none; and DEP 19 says that a proposer of a major change “may be asked” to write one. A new feature is first proposed among the project’s new-feature ideas on GitHub, which the steering council reviews.

Who decides

Anyone may open a ticket, triage one, write a fix or review a pull request; merging, releasing and deciding belong to roles, whose present holders the project’s teams page lists:

Two accounts of these rules stand at this commit. Django’s documentation describes the organization as DEP 10 set it up and DEP 12 amended it, and those two DEPs, each of which now calls itself a historical document, send their reader to it for how the council works. DEP 19, accepted by the steering council, restates the governance in one document, declares that it supersedes both, and differs from the documentation on how the council is chosen, what it may do and how it decides.

The documentation and the DEPs at this commit settle that a change to the governance is adopted only once the foundation’s board votes for it. They leave open whether DEP 19 has been adopted, and so which of the two accounts governs: none of them records the board’s vote, the documentation still describes the older rules, and DEP 19’s state cannot tell, since an adopted DEP stays accepted until its implementation is complete.

What is stable, and what is internal

Django’s stability promise is that code written against one release keeps working with later ones, apart from minor changes their release notes list as backwards incompatible. A stable API is not moved or renamed without a backwards-compatible alias, gains features without changing the meaning of what is there, and when it has to go is first deprecated: it stays, warning when it is used, for at least two feature releases. It is broken without that only where a bug or a security hole leaves no other way.

What is stable is, in general, what the documentation covers, apart from its internals area. Two marks put a name outside the promise: the documentation’s calling it internal, which reserves Django’s right to change it, and an underscore at its start, Python’s way of marking a name private. Such a name, BaseHandler._get_response or QuerySet._fetch_all, says how the code works at one commit; it is not an interface, and code that calls or overrides it may find it changed or gone in a later release, with no alias and no warning. The security policy draws the same line from the other side: a vulnerability that depends on calling Django’s private, undocumented functions in an unsafe way is not a valid report.

Releases and security fixes

Django has made a feature release about every eight months, every third one a long-term support release that receives security and data-loss fixes for three years, with patch releases between. DEP 20, accepted, makes the release after 6.2 Django 2028, the first of one feature release a year, each supported for three years; the releases and their dates are in What changed.

A security issue is reported by email to security@djangoproject.com, which reaches the security team, and not in the public ticket tracker. The team acknowledges a report within three working days and aims to resolve each within ninety days. A confirmed issue is disclosed on a day set in advance: usually about a week before it, the django-announce mailing list is told the date and the severity, and a private list, mostly of operating-system vendors and other distributors of Django, is sent the full description and the patches. On the day, the patches are applied to main, to the two newest release series and to the long-term support releases still supported, new releases are uploaded, and a post on the project’s blog describes the issue; an issue that affects only main is fixed in public.

How the code came to be what it is at this commit is told in The first decade: from a newsroom to 1.8 and The second decade: from 1.9 to 5.0.