Django community: RSS
This page, updated regularly, aggregates Community blog posts from the Django community.
-
How I decide which Python and Django versions I want to support
How I decide which Python and Django versions I want to support A recent post on Mastodon got me thinking about what my philosophy for dropping support for old versions of Python and Django is. Here’s the post: 🚨 Important Announcement 🚨 Going forward all my packages will only “officially” support maintained #Python versions. Meaning since October only 3.14 and now 3.15. This has no effect on Django version support. CVEs will be backported to older 🐍 releases. – @codingjoe I tend to support versions long past their End of Life date. I jokingly said that I should spend time upgrading old websites instead of spending time writing a rationale why not. I don’t want to argue for my position, but maybe this post will serve as the place to point people towards when the question arises again in the future. The short answer: it depends on whether I’m working on a project, on my own machine or on a library. Projects When working on projects I’m always updating to the current stable version or even the bleeding edge. I want the projects to be as future-proof as possible and I also want to give early feedback when stuff breaks. … -
Django in Space - Loes Crama
🔗 LinksLoes on LinkedIncosineDjangocon EU: How Django is helping to build the biggest X-ray observatory to date - Loes Crama📦 ProjectsMarimodjango-sesdjango-anymail📚 BooksWeapons of Math Destruction by Cathy O'NeilSlouching Towards Utopia by J. Bradford DeLong🎥 YouTubeYouTube Channel: @djangochat -
CRUD: REST without the HTTP
REST as practiced usually arrives wrapped in HTTP — verbs, URLs, status codes. Strip all of that away and a more general principle is left underneath: for any object, we should be able to create it, read it, update it every valid way, and delete it, one at a time or as a member of a collection. -
Issue 359: Python 3.15 Is Here and Python 3.16 Alpha 1
News Python 3.15.0 (final) is here! Python 3.15 is out, with explicit lazy imports (PEP 810), built-in frozendict and sentinel types, UTF-8 as the default encoding, and a JIT that runs 7-12% faster depending on the platform. If you use IDLE or tkinter on macOS 27, read the release notes first: menu dialogs can hang. Python 3.16.0 alpha 1 is now available The first of seven alphas for Python 3.16 is out, with features landing until the May 4, 2027 beta and the final release planned for October 5, 2027. Library maintainers are invited to start testing now. Django Software Foundation Django Steering Council Meetings - 2026 Notes from the October 5 meeting with the Fellows: the set-returning DEP needs reviewers, every memcached Python client is now defunct, and Python 3.15 support raises questions about makedirs permission semantics. PyPy 8.0 support and the Sovereign Tech Fund's resilience program were also on the agenda. Wagtail CMS News We have a stellar group of speakers for Wagtail Space 2026 The schedule is out for this year's online, half-day Wagtail Space, opening with Thibaud Colas's State of Wagtail. Talks cover running Wagtail at scale on Kubernetes, measuring a site's web emissions, agent readiness, … -
Django: check version support with norwegianblue
Django projects end up slotting into a bunch of software release cycles: Django itself, Python, database servers, cache servers, and more. It can be hard for us developers to keep track of all of them, with their different support policies and end-of-life dates, and running an unsupported version means missing out on important security or bug fixes. norwegianblue is a handy command-line tool for checking software support dates. It fetches data from endoflife.date, a community-maintained database of release cycles for hundreds of products, and displays it as a colour-coded table. It’s from Hugo van Kemenade, the Python 3.14 and 3.15 release manager, and named after the deceased parrot from Monty Python’s infamous Dead Parrot sketch. Let’s look at checking the release cycles for Django, Python, PostgreSQL, and other relevant tools with it. Install it norwegianblue provides two commands: norwegianblue and the shorter alias eol. I recommend the alias, since it’s easier to type and remember, and will use it throughout this post. To make both commands available everywhere, install norwegianblue globally. If you use uv, do so with uv tool install: $ uv tool install norwegianblue Otherwise, install it with your preferred tool, such as a global pip install or … -
Pycon NL keynote: believe in routes - Marcelo Trylesinski
(One of my summaries of the 2026 one-day Pycon NL conference in Utrecht, NL). Routes: not every route starts the way people think. Here's his route through life. You might know Marcelo from uvicorn, fastapi, starlette, logfire, Pydantic AI, MCP Python SDK, httpx2... It started for him in 2017 when he played league of legends for a full semester and failed all courses. This closed his main route: graduating on time and getting the expected job. Instead he got a good-enough job somewhere in Florianópolis (Brazil). What was your closed route? It might be a degree you didn't finish. A field that changed under you. A job you didn't get. A move. One thing he wants to talk about: curiosity needs a direction. You might be curious, but where does it get you? You might have a direction (like a degree plus the expected job), but direction alone, what does it get you? But if you have both curiosity and direction: that's nice. Marcelo was curious in open source. What helped him a lot was to get involved. With open source you can look at issues and start fixing them and slowly getting more and more involved. In 2020, the … -
Pycon NL: 3D data science with Python - Sergio Peral
(One of my summaries of the 2026 one-day Pycon NL conference in Utrecht, NL). Why Python for 3D? It often used to be done in C++. He showed an example in C++ and Python: the Python example was much shorter. But: Python is often only the interface, behind the scenes the library you use is often written in C/C++/Rust/etc. The library landscape. There are many libraries you can use. Loading and storing: laspy, pdal, pyproj. Arays and speed; numpy, scipy, numba, dask. Processing: open3d, trimesh. Visualisation: pyvista, vtk. Learning: scikit-learn, pytorch3d. One real pipeline. He used a pointcloud of part of the Jaarbeurs complex (where the conference was taking place), sourced from the Dutch public https://ahn.nl data source. The density is about 18 points per square meter and it uses some Dutch coordinate system ("RD New"). A point cloud is just a set of points in 3D space. You can also represent it as a mesh (3d areas). A "voxel grid" is also often handy: you convert what you're seeing into small stacked cubes. What you need to do in a project: acquisition, preparation, exploration, analysis, visualisation. No single library does the whole job. A partial exception is numpy: every … -
Pycon NL: practical observability - Daria Korsakova
(One of my summaries of the 2026 one-day Pycon NL conference in Utrecht, NL). Full title: stop firefighting: practical observability for Python APIs, workers & jobs. The most important points: What does it mean for a system to be observable? Does that answer look the same for an API, a worker and a job? Metrics tell us something is wrong, but how do we find out what happened and where? How do we get the system to tell us, before our users do? Where do we actually start without doing everything at once? They started with a prototype of a new system. They had questions like "does it work" and "is it fast enough". So they added a bit of monitoring: just a couple of logs and some simple graphs. And pushed it to production right away... What does "observable" mean? It means you can answer questions like: is it up? Is it ready to serve traffic? Is it doing useful work? Is it failing? Is it slow? What changed recently? Which dependency/workload/customer/job/event-type is involved? Is the answer the same for everything? No. You can have an API that restarts just fine on an error. So: it is up again, … -
Pycon NL: practical software architecture for Python developers - Henk-Jan van Hasselaar
(One of my summaries of the 2026 one-day Pycon NL conference in Utrecht, NL). First some terminology. Cohesion and coupling for instance. Cohesion means how much the elements in a module belong together. "Belonging together": working towards the same goal or function. Watch out what your answer is: is there an "and" in the sentence. "This module reads data and puts it in the database". That's a sign of lower cohesion. Cohesion also has to do with your mental load: what can you keep in your head at the same time? Coupling. Basically the blast radius: how much breaks when you change an object. Change. Not often talked about. Architecture is more than diagrams. Architecture actually is making future changes cheaper. No change, no pain. Loose coupling, high cohesion is good. Tightly coupled, low cohesion is bad. Python allows us lots of freedom. There is no enforcement of architectural boundaries. You have type hints, but they're not enforced. Python's basic assumption is that we're all reasonable and responsible programmers. Let's look at an example problem. We have "the internet" that calls "our REST API" that stores stuff in "our database". We start with a single function in our API that … -
Pycon NL: zero-downtime multi-tenancy in Django - Thiago Bellini Ribeiro
(One of my summaries of the 2026 one-day Pycon NL conference in Utrecht, NL). Full title: zero-downtime multi-tenancy in Django: from user-centric to organizations-based architecture. He works for Sendcloud. Originally their code was 2010-style Django. Every business object (Parcel, Order, etc) is linked to a django User. But... users can belong to organisations and organisations should be the ones connected to the business objects. Ok, they moved to a "core" user and "sub" users. But still users could only belong to a single organisation, for instance. What they actually need is many users per organisation. And also many orgs per user. Roles per membership instead of per user. They designed a new system based upon this. But: they had around 20 Django apps and 40 models with a link to user_id. How to migrate? The solution was to use a "proxy model". They started an "organisation" model that simply was a differently named Django model, pointing at the same table as the existing user model. This allowed them to keep almost everything the same with only minimal database migrations. After that, they moved a little bit of functionality over to the new organisation model. Again, a small, minimal database migration. … -
Pycon NL keynote: sustaining open source for the future - Georgi Ker
(One of my summaries of the 2026 one-day Pycon NL conference in Utrecht, NL). This year is the first community-organized Pycon NL: hurray! Most of us use open source as users. It is free! But all those open source projects only exist because someone started it and because someone maintains it. "Care became contagious": she told the story about someone in Mumbay, India that started to clean up plastic waste that covered the whole beach. He and a 84 year old neighbor. Slowly other people joined in. Then a lot more. Care became contagious! Python started when Guido van Rossum made a new language in his Christmas holiday. But projects like this are fragile. The beach cleanup (almost?) stopped after 109 weeks: administrative lethargy, heckling, etc. (She said it stopped, but I guess it almost stopped, as later on she had photos of a clean beach with newly-hatched turtles). If you start a nice open source project, you're probably not thinking my dream is to answer Github issues for the next 20 years. Sustainability is not endurance. Sustainability is regeneration. Joining a community, but also having the option to leave (just as an example). Open source is safe. In open … -
Pycon NL: building resumable Python pipelines - Yuvraj Singh Pathania
(One of my summaries of the 2026 one-day Pycon NL conference in Utrecht, NL). Full title: fire, forget, regret: building resumable Python pipelines. If you run a task in an async loop, there's often no reference to the task. So it can be garbage collected! You can solve that by keeping a reference in some list. But even then, the whole process can die. What happens with your task then? Often you have to re-run the task. He himself is into LLMs, so failed tasks that you have to re-run can become expensive. BackgroundTasks is part of FastAPI and it works great for spinning off longer running tasks. Real handy, but there is no retry mechanism and no recoverability in case of crashes. "Fire-and-forget". You can use specific task queues. ARQ, Celery, Dramatiq. In this case, the job itself is safe and can be re-tried. But not the individual steps within the job. What he wants is durable execution. Write down every step you finish; on restart, skip what is written. It can save you lots of time (and possibly money). It might be simpler to set up than you think. His code + slides are at https://github.com/batman004/fire-forget-regret Unrelated photo … -
Pycon NL: what's inside an asyncio event loop? - Taras Kozlov
(One of my summaries of the 2026 one-day Pycon NL conference in Utrecht, NL). An asyncio event loop is defined by asyncio.AbstractEventLoop. That's a large API with more than 50 public methods, but only three are fundamental. At the lowest useful leve, the loop manages callbacks, i/o and timers. We need a way to put events on a queue and a way to grab events from a queue and execute them. call_soon() We need timers too, for callbacks that must be run after some time. call_later() Sleep only knows about time. Often we want to sleep until the next time, unless a socket becomes ready first. So we need a "sleep" that can be interrupted by I/O readiness. add_reader(), add_writer() His own example implementation of asyncio for educational purposes is at: https://github.com/tarasko/eduloop , it is only 250 lines. Handy if you want to understand asyncio. He showed this simple example code, incrementally implementing the points above. The nice thing about asyncio is coroutines. A coroutine is an extended kind of function that can be paused and resumed. The result is a "future". A future represents an eventual result of an async operation. So: a future is pending until somebody supplies … -
Hiring in 2026 - Jon Gould
🔗 LinksFoxley TalentFoxley Talent YouTubePeople or Code show on YouTube and Spotify📚 BooksThe Infinity Machine by Sebastian MallabyThe Concept of Mind by Gilbert Ryle [Carlton]The Go-Giver by Bob Burg and Jon Mann📦 ProjectsFarhanAliRaza/prongs — run just the tests you editedjustinmayer/django-benchmark - Django performance benchmark profiler🎥 YouTubeYouTube Channel: @djangochat -
Django Beginners: Part 2
I first wrote about this idea in day 287 where I framed it under the name of django.contrib.beginners. The idea (as a quick reminder) is that if I wondered if we could have a package that added extra warnings or safeguards for beginners that meant they would not make common foot-gun mistakes with Django. I've since expanded on the idea a bit and formalized two concepts that I've called Guardrails and Scaffolds. Guardrails being those warnings, those limiters that are stricter defaults that prevent beginners from committing those common mistakes when starting with Django that we know to avoid. They can be opinionated, and we can choose whether to turn them on and off, and silence them, or that kind of thing. Scaffolds on that other, which are pieces of code that at times prevent the rabbit hole or make things easy to get started. A really good example of this is that django.contrib.auth, doesn't ship with a user registration view & url because there are an infinite combinations of what you could do with registration in a project. But that often causes a new developer to jump down the rabbit hole of the auth documentation and become confused. And … -
`replace()` as an iterator
String.prototype.replace() with a global regular expression and a function has iterated over the interesting parts of a string since 1999, long before array extras like forEach() and filter(). It is rarely the best tool today, but it is still in a lot of code, for historical reasons and for a certain technical beauty. Let’s see how it works, what it is good for, and what it costs, so that a replace() whose result goes unused makes sense when we meet it. -
You Can't Change Your Boss
I frequently get asked for advice on dealing with a bad boss. That’s not special: “my boss sucks, what do I do?” is an incredibly well-represented genre in advice columns like Ask a Manager, etc. My advice here is simple: you can’t change your boss’s behavior. It’s best to treat your boss’s behavior as fundamentally immutable, like a force of nature. You can certainly try asking the rain to hold off until after your hike, but it’s unlikely to be effective. Assume that trying to get your boss to change their behavior will be similarly ineffective. Your only real choices when you have a bad boss are: learn to live with it, or find another job. (These choices suck, I’m aware.) Thing is, giving feedback across a power gradient is rarely successful. At work, feedback always carries an implicit “or else”: when your boss tells you to make a change, there’s an implicit “… or I’ll fire you” that’s rarely spoken but always there. Even in the most egalitarian workplaces, even with the best bosses, you’ve got an incentive — keeping your job — to listen to your boss’s feedback. The reverse isn’t true: you have no power over your … -
Issue 358: Django 6.1.2, 6.0.9, and 5.2.18 Security Releases and Djangonaut Space Session 7
News Django security releases issued: 6.1.2, 6.0.9, and 5.2.18 Four CVEs fixed: denial-of-service risks in language-code lookups and HTTP header parsing, spatial lookups that could make GDAL fetch external rasters, and model formsets with editable primary keys that forged POST data could use to delete or create instances. Raster bytes passed to spatial lookups must now be wrapped in GDALRaster, a backward-incompatible change, so upgrade and check your GIS code. Welcome to Session 7 Teams 👩🏽🚀 Djangonaut Space Session 7 runs October 12 to December 6 with its biggest cohort yet: 28 Djangonauts picked from 92 applicants, across eight teams working on Django core, accessibility, Django Debug Toolbar, djangoCMS, and the Django Girls+ website, plus two Python projects, BeeWare and Render Engine. Django Software Foundation Django security reporting update Django no longer takes new security reports through HackerOne. Existing HackerOne reports stay open with the Security Team, and new issues should go to security@djangoproject.com as described in the security policy. Python Software Foundation Python 3.15.0 candidate 3 is here! Last-minute lazy-import release blockers earned 3.15 a surprise third release candidate, pushing 3.15.0 final to October 9. Maintainers should test and publish 3.15 wheels now; release candidate wheels will work with … -
Django: set up its test suite with uv
When contributing to Django, you’ll want to run its test suite to check your changes. The official contributing docs cover setup in Running the unit tests, using a virtual environment and pip. Here’s an alternative guide using uv. Setup First, clone Django and change into the repository: $ git clone https://github.com/django/django $ cd django (You can fork it later if you want to make a pull request.) Then, create a virtual environment: $ uv venv Using CPython 3.14.6 Creating virtual environment at: .venv Activate with: source .venv/bin/activate uv automatically picks a compatible Python version for you, downloading one if needed. Next, install Django in editable mode, plus the test requirements, in one command: $ uv pip install -e . -r tests/requirements/py3.txt uv pip automatically targets the .venv directory, so there’s no need to activate it first. Run the tests Activate the virtual environment, change into the tests directory, and run runtests.py: $ source .venv/bin/activate $ cd tests $ ./runtests.py Testing against Django installed in '/.../django/django' with up to 8 processes ... Skip pylibmc if it won’t build The test requirements include pylibmc, a memcached client that wraps the libmemcached C library. In my experience, it’s the biggest sticking point when … -
Questions to Ask a Company Using Django
Interview questions for your next job. -
Math-grounded APIs
Some types arrive with their operations already specified — by mathematics. If a type is a number, a set, or a sequence, math has written the complete API for us; the work is to implement it, and to implement it efficiently. -
Python 3.10, Django 4.2 and Node.js 20 Are Out of Support: What to Do Now
Django 4.2, Node.js 20, Amazon Linux 2, RDS MySQL 8.0 and Python 3.10 all reached end of support in 2026, with PostgreSQL 14 next. Here are the dates, what they mean, and the upgrade order we use. -
Python 3.10, Django 4.2 and Node.js 20 Are Out of Support: What to Do Now
Django 4.2, Node.js 20, Amazon Linux 2, RDS MySQL 8.0 and Python 3.10 all reached end of support in 2026, with PostgreSQL 14 next. Here are the dates, what they mean, and the upgrade order we use. -
Issue 357: Malcolm Tredinnick Prize Nominations and Django 6.2 Features
News Nominate Someone for the 2026 Malcolm Tredinnick Memorial Prize The annual prize honors someone who welcomes newcomers, freely helps others, and grows the community, with a stipend meant to fund travel to a DjangoCon, PyCon, or sprint. Nominate someone by October 15 (Anywhere on Earth). Python 3.10.22, 3.11.17, 3.12.15, 3.13.16 and 3.14.8 are now available! Security releases across all five series, with fixes for tarfile extraction filters, zipfile decompression bombs, and SSL hostname validation. Python 3.10.22 is the final 3.10 release, and 3.13.16 is the last full maintenance release of 3.13, so plan your upgrades. Python Language Summit 2026 Seth Larson's writeups from the first summit held in Europe since 2011, where 47 core developers in Kraków covered free-threading, Rust for CPython, garbage collection, type manipulation, and an AGENTS.md for CPython. The summit will now alternate between PyCon US and EuroPython each year. Updates to Django Today, "Updates to Django" is presented by Raffaella from Djangonaut Space! 🚀 Last week we had 6 pull requests merged into Django by 5 different contributors News in Django 6.2: The new django.utils.asyncio.maybe_aclosing returns a context manager that calls aclose() on a caller-provided iterator only if it defines one. Support for GDAL 3.3 … -
Django: serve apple-app-site-association and assetlinks.json
If your site has companion Apple or Android apps, you probably want links to your site to open in those apps, when installed. Both platforms support this, with Apple calling the feature Universal Links and Android calling it App Links. But an app can’t just claim to handle your links, or any malicious app could hijack them. Instead, both platforms require two-way association: the app declares which domains it handles, and each domain confirms which apps may handle its links. The domain’s side of that handshake is a JSON file served under the reserved /.well-known/ path, one per platform: /.well-known/apple-app-site-association for iOS, iPadOS, and macOS. /.well-known/assetlinks.json for Android. These files can do more than link handling. Both can also associate apps with your site for password autofill and passkeys, so users can sign in to your apps with credentials saved from your site. In this post, we’ll look at serving these two files from Django, with tests. It follows the same pattern as my recent post on serving a security.txt file, but with JSON and a few gotchas covered below. Write the Apple file Here’s an example apple-app-site-association file, following Apple’s documentation: { "applinks": { "details": [ { "appIDs": ["ABCDE12345.com.example.app"], …