Django community: RSS
This page, updated regularly, aggregates Community blog posts from the Django community.
-
Django: fixing a memory “leak” from Python 3.14’s incremental garbage collection
Back in February, I encountered an out-of-memory error while migrating a client project to Python 3.14. The issue occurred when running Django’s database migration command (migrate) on a limited-resource server, and seemed to be caused by the new incremental garbage collection algorithm in Python 3.14. At the time, I wrote a workaround and started on this blog post, but other tasks took priority and I never got around to finishing it. But four days ago, Hugo van Kemenade, the Python 3.14 release manager, announced that the new garbage collection algorithm will be reverted in Python 3.14.5, and the next Python 3.15 alpha release, due to reports of increased memory usage. Here’s the story of my workaround, as extra evidence that reverting incremental garbage collection is a good call. Python 3.14’s incremental garbage collection Python (well, CPython) has a garbage collector that runs regularly to clean up unreferenced objects. Most objects are cleaned up immediately when their reference count drops to zero, but some objects can be part of reference cycles, where some set of objects reference each other and thus never reach a reference count of zero. The garbage collector sweeps through all objects to find and clean up these … -
Django News - 30% Off PyCharm Pro – 100% for Django - Apr 17th 2026
Introduction Django News Newsletter is moving! Just a quick heads up. We’re planning to move our newsletter to a new platform next week. If things look a little different when it shows up, it’s still us. Django Newsletter News PyCharm & Django annual fundraiser JetBrains and the Django Software Foundation team up again to offer 30% off PyCharm while matching donations to fund Django’s core development and community programs. djangoproject.com New Technical Governance - request for community feedback Django proposes a simpler, more flexible technical governance model and is inviting community feedback ahead of a planned July 2026 rollout. djangoproject.com Could you host DjangoCon Europe 2027? Call for organizers DjangoCon Europe 2026 is happening right now in Athens, Greece but plans for 2027 have already begun. This post lays out all the resources for any questions, support, and more for future organizers. djangoproject.com Reverting the incremental GC in Python 3.14 and 3.15 - Core Development Python is rolling back its new incremental garbage collector in 3.14 and 3.15 after real-world memory issues, reverting to the proven generational model while rethinking a future reintroduction. python.org PEP 772: Packaging Council governance process (Round 3) - Packaging / Coordination PEP 772 has officially … -
Djangocon EU: body of knowledge - Daniele Procida
(One of my summaries of the 2026 Djangocon EU in Athens). Athens! The thinking industry started here. Athens is often the origin if you follow ideas to the source. Here also Socrates was found guilty (280-221) for "corrupting the youth" on trumped-up charges. Though... he made it is job to be a complete nuisance: exposing everyone's hypocrisy and asking difficult questions. After the 280-221 vote he got to give a speech in reaction. After that, the vote on the actual punishment was 360-141 in favour of the death penalty. The speech must have been particularly irritating. On to a different subject. He watched the recent launch of the NASA rocket that went to the moon. A marvel of technology. That was measured using body parts, being 322 feet tall. And the distance to the moon in miles. Why not the scientific meter and kilometer? Plato already mentioned it. "Now take the acquisition of knowledge; is the body a hindrance or not, if one takes it into partnership to share an investigation". And "when the soul tries to investigate anything with the help of the body, it is obviously led astray". 0.098 km = 98 m = 98000 mm, a child … -
Djangocon EU: improving runserver with django-prodserver - Andrew Miller
(One of my summaries of the 2026 Djangocon EU in Athens). Original title: improving one of Django's most used APIs — and it's not the one you're thinking of. (I'm using a more descriptive title for my blog entry.) APIs are everywhere. Django rest framework, but also the models layer. And: manage.py runserver, he considers that an API. Everybody runs it. So: can we improve it? "Runserver" doesn't sound the same as "devserver" or "rundevserver". It doesn't advertise that it is only intended for development. A name change could help there. But... Django really likes to be stable. It is probably too entrenched to change. Production is missing a cohesive API. You normally run something like gunicorn myapp.wsgi 0.0.0.0:8000 --workers 4... He tried to get improvements in. Since 5.2, there's a warning when you start runserver: "it is only intended for development". But you might miss it when you get lots of log messages. Other people complained about the extra two lines. He started django-prodserver. pip install django-prodserver[gunicorn]. You can then run manage.py prodserver (and manage.py devserver, he snuck that in). You have to add a bit of configuration to your settings file: PRODUCTION_PROCESSES = { "web": { "BACKEND": "django_prodserver.backends.gunicorn.GunicornServer", … -
Djangocon EU: How Django is helping to build the biggest X-ray observatory to date - Loes Crama
(One of my summaries of the 2026 Djangocon EU in Athens). She works at Cosine, they develop measurement systems and space instrumentation. They work for the space industry (ESA, NASA, etc). They're now working on "high-energy optics", the NewAthena x-ray observatory, the biggest one to date. NewAthena: NEW Advanced Telescope for High-ENergy Astrophysics. Planned launch is in 2037 on Ariane 6.4. Talking about rocket science is cool, but where's the software? Within the company, software is an internal service, supporting scientists. Handling data in many ways: visualization, analysis, processing, management. Django plays a big role in all of this. When you build something with Django in a scientific context, you really need to understand the data. Workflows must be flexible. R&D and production often don't need to be strictly separated. Multiple datastores for various purposes (like an extra MongoDB, for instance) is often handy. Their application consists of: SXRO (silicon x-ray optics) database. A Mysql database. Django. The goal is to track all the components that go into the observatory. Status and quality. Configuration and geometry. Component relationships. Inspections. History of all the components. The default Django admin is their primary method of using the application. Often, it is said … -
Djangocon EU: supply chain attacks on Python projects - Mateusz Bełczowski
(One of my summaries of the 2026 Djangocon EU in Athens). Full title: what's in your dependencies? Supply chain attacks on Python projects. How supply chain attacks work: attackers don't attack your code directly, they target something you trust. A typical Django project has lots of dependencies. Direct dependencies and "transitive dependencies", dependencies of our dependencies. If you depend on requests, requests itself will grab certify and urllib3. Possible package attacks: Inject malicious code directly into the repo. Create malicious package. Typosquatting (abusing typos), slopsquatting (abusing typos made by LLMs). "Brandjacking": quickly after deepseek became popular, a deepseekai package was published that stole credentials. Compromise existing package. Credential stealing, CI/CD exploits. What attackers typically do with access is to steal credentials. Environment variables, cloud keys (AWS_xyz), pypi tokens, ssh private keys, database URLs, saved passwords. Example: num2words was hacked in July 2025. Phishing leading to maintainer credentials theft. Fake login page at pypj.org instead of pypi.org. Then they uploaded faulty releases with the captured credentials. Credentials weren't rotated, so a second attack happened a few days later. This malware targeted .pypirc files, leading to more compromises. How can we defend from this kind of attacks? Depends on the kind of … -
Djangocon EU: lightning talks day 3
(One of my summaries of the 2026 Djangocon EU in Athens). Announcement - Carlton Gibson They've been working on improving the technical governance of Django. They'd like to get feedback. There's a blog post about it. Oh, and look at the "30% off PyCharm" button on the django website, that raises quite a lot of funds for Django. PyCharm's sponsoring is a very sizeable financial part of Django, thanks! Even more table partitioning with Django, Postgres and UUIDs - Tim Bell (See his earlier talk on partitioning). UUID is 128-bits, usually displayed as hex strings. It starts with the unix timestamp, followed by several random fields (in version 7). In version 8, you have more flexibility. You can customize it to put a specific value (an id of a related field in their case) in the first field. Partitioning per UUID (they used it as their ID) then effectively also partitions on the related field. Speeding up Django startup times with lazy imports - Anze Pecar Imports in Python can be slow. Luckily, python has something build-in to check it, the "importtime" flag: python -X importtime manage.py check He worked around the packages he found by importing the package inside … -
Djangocon EU: zero-migration encryption - Vjeran Grozdanic
(One of my summaries of the 2026 Djangocon EU in Athens). Full title: zero-migration encryption: building drop-in encrypted field in Django. He works at Sentry. Huge site with a Django backend and thousands requests per second. He had to add a new table to store 3rd party API credentials. Oh: should this be encrypted? Yes. But: each team has its own way to encrypt data. And there were at least 10 encryption keys here and there (as environment variables). And tens of places where encryption/decryption happens. So: better to build a generic solution. Or use an existing generic solution. And yes, there are multiple libraries. EncryptedCharField looked nice. But the problem was all the existing data in the various places. Sentry is not a site that you can shut down for a while, so you have to do it with zero downtime. This means you can never change an existing column type. A solution could be to add a new encrypted field next to the existing one. Then fill it and backfill it and make sure no new data is written to the old field and then you can remove the old field. But that's quite a job with all … -
Djangocon EU: auto-prefetching with model field fetch modes in Django 6.1 - Jacob Walls
(One of my summaries of the 2026 Djangocon EU in Athens). There's an example to experiment with here: https://dryorm.xterm.info/fetch-modes-simple Timeline: it will be included in Django 6.1 in August. The reason is the 1+n problem: books = Book.objects.all() for book in books: print(book.author.name) # This does a fresh query for author every time. You can solve it with select_related(relation_names) or prefetch_related(relation_names). The first does an inner join. The second does two queries. But: you might miss a relation. You might specify too many relations, getting data you don't need. Or you might not know about the relation as the code is in a totally different part of the code. Fetch mode is intended to solve it. You can append .fetch_mode(models.FETCH_xyz) to your query: models.FETCH_ONE: the current behaviour, which will be the default. models.FETCH_PEERS: Fetch a deferred field for all instances that came from the same queryset. More or less prefetch_related in an automatic, lazy manner. models.FETCH_RAISE: useful for development, it will raise FieldFetchBlocked. And it will thus tell you that you'll have a performance problem and that you might need FETCH_PEERS This is what happens: books = Book.objects.all().fetch_mode(models.FETCH_PEERS) for book in books: # We're iterating over the query, so the … -
Djangocon EU: Django templates on the frontend? - Christophe Henry
(One of my summaries of the 2026 Djangocon EU in Athens). It all started with formsets: you generate a new form based on other forms. You can use it to create pretty fancy forms. But your designer can get quite creative. And you might have variable forms that have to react to user input. A common solution is to use htmx, but that means server requests all the time. And some users have really bad connections. Regular requests aren't handy in that scenario. He looked at django-rusty-templates: Django's template engine implemented in Rust. It had a template parser that he could re-use. With OXC (javascript oxidation compiler) he converted that to javascript. That way, he could offload much of the django form creation handling to the frontend, including reacting to user input and showing alerts. The work-in-progress project is called django-template-transpiler: https://github.com/christophehenry/django-template-transpiler . Don't use it for production. Unrelated photo explanation: a cat I encountered in Athens on an evening stroll in the neighbourhood behind the hotel. -
Djangocon EU: a practical guide to agentic coding for Django developers - Marlene Mhangami
(One of my summaries of the 2026 Djangocon EU in Athens). You could get code completion in your IDE for a while. Since about two years, you can generate code with an LLM by describing what you want and copy/pasting the results into your program. Nowadays you can do agentic coding. You give an AI agent access to your environment so that it can actually create the files (including a file with tests) on its own. A definition: an AI agent is an LLM (large language model) that calls tools in a loop to achieve a goal. You start with a "prompt", the agent starts its loop and after a while it is done. In the mean time you can interrupt/steer or give more "context". Within the loop, three things happen: Gather context. A "context" is something the LLM can use to gather information. You can attach a github issue, for instance. Or you attach files. Tell it "follow the conventions in this file. Instruction files also help: copilot-instructions.md, agents.md. There's something called "context engineering". If your AI agent starts to remember too much context, it starts to be less effective. So cleaning up old parts of the context might … -
Djangocon EU: digitising historical caving data with Python and Django - Andrew Northall
(One of my summaries of the 2026 Djangocon EU in Athens). Andrew's hobby is caving: exploring wild cave systems. It is a niche hobby, but he likes it a lot. One of the nicest thinks is that you can be the first human being standing in a specific spot on earth. Cavers achieve high standards, without formal organisation. Sounds like Django :-) With Django, we have exposure and visibility and bug trackers: we're transparent. So our high standards are verifiable. Would the same be possible for caving? The safety record is real good, but the public image is bad. Can the safety record be made more visible? There's an (American) organisation that has historical incident reports. But... mostly in printed text. Image recognition was hard. And something like "fall 1985" isn't really a Postgres data format. Several volunteers put a lot of work in it by manually entering incidents in a Django website that Andrew build. It was slow going. Nowadays they have an LLM pipeline for it that is actually really good. Extraction: docling. Splitting into separate incidents: LLM. Formatting/structuring/checking: LLM. Normalisation: mostly with the help of Django. Docling (https://github.com/docling-project/docling) is a great project for extracting usable text data … -
Djangocon EU: beyond print() debugging: observability for Django apps - Laís Carvalho
(One of my summaries of the 2026 Djangocon EU in Athens). OpenTelemetry (or OTel) is an open source vendor-neutral way of observering your app. There are lots of vendors, open source projects, language support, integrations. What is observability? Understanding the inner works of a system from the outside. So: "why is this happening?". For observability you need proper instrumentation. It is all about "signals" (or symptoms) and "causes". There are three pillars of observability: Logs. A log message is normally a datetime, a level and a message. If you have a logfile, it can be hard to group the individual log messages that belong together: everything is in one long undifferentiated list. Traces are more elaborate. Log items now have start/end datetimes and they can be nested. Metrics. A collection of datapoints at intervals. When stored with timestamps, it becomes a timeseries. For instance a timeseries with the duration of all the web requests. Monitoring and observability according to her definition: monitoring is what is happening, observability is about what happened. Signals and causes. A signal might be "my website is showing lots of Error 500's", a cause might be "my database is down". When in doubt about your system … -
Djangocon EU: role-based access control in Django - how we forked Guardian - Gergő Simonyi
(One of my summaries of the 2026 Djangocon EU in Athens). He works for authentik (an "open-core, self-hosted identity provider"). Note: in the talk he'll mix "access control" and "authorization". In Django, every model gets some basic permissions for CRUD named after the app and the model. You can ask a user object if it has a certain permission. That method, behind the scenes, will ask all authentication backends with backend.has_perm(self, perm, obj). The default will check whether the user has the permission or if the user belongs to a group that has the permission. So that's quite a query. The backends are queried in turn. If a backend doesn't know if a user has a permission, it can just return None, the next backend will then be checked. If the backend knows the user has no access, it raises PermissionDenied. The backends have methods like .has_perm(self, perm, obj), but "obj" isn't normally called, it is None by default. But you can implement it if you want object permissions. Django-guardian is an implementation of object permissions for Django by providing an extra authentication backend: ObjectPermissionBackend. user.has_perm("change_book") asks if the user has the permission to change all books. user.has_perm("change_book", obj=my_book) asks … -
Djangocon EU: is it time for a Django admin rewrite? If so, how? - Emma Delescolle
(One of my summaries of the 2026 Djangocon EU in Athens). One of Django's "batteries included" batteries is the admin interface. It is great. With a few lines you get Full CRUD, plus filtering, searching and pagination. But it isn't perfect: Want drag/drop ordering? Nested inlines? An extra button next to "edit" and "delete"? Form layout with columns? change_list_view and change_form_view are hard to extend. Better translation support? (There are plug-ins for most of the individual issues.) The admin actually predates most of the rest of Django. It has stagnated even though Django got many new features. The admin is a separate framework within django. Lots of patterns from regular Django views don't apply. You're missing musle memory when working on the admin. The community knows there's a problem. 30% of new proposed fixes are for the admin. There's discussion about a new UI. And there's issue #70 that proposes a change. The community has also been trying: django-admin2. Abandoned at the moment. Grapelli/Jet. Mostly better skins and extensions on top of the regular admin. Wagtail. It is actually a CMS, but people are using its admin interface for Django itself. drf-schema-adapter. Her own attempt via django restframework and a … -
Djangocon EU: Django task workers in subinterpreters - Melhin Ahammad
(One of my summaries of the 2026 Djangocon EU in Athens). Full title: Django task workers in subinterpreters: single-server Django applications without process overhead. He was inspired to tinker with subprocessors by Antony Shaw`s pycon talk You normally use a wsgi runner like gunicorn to run your django app. There's also daphne, uvicorn and hypercorn: those also support asgi. If you have tasks, you might use celery , RQ or django-Q (or django-tasks). Instead of a single gunicorn, you then have a broker, a worker and a web server: all deployed separately. He's a fan of the fediverse and wanted to run his own server, but he just wanted one program, not three. You need python 3.14 to actually try some of the stuff he talks about. And you need to have some longer-running tasks in Django. Python 3.14 allows you to run multiple python interpreters in one process. You have separate imports, builtins and separate namespaces per interpreter: isolation. There's even IPC (inter process communication) via memory. Objects are copied. Subinterpreters handle the GIL by each having their own. Django: preferably 6.0 as you can then use the new Django task framework. Combining it, you'd use a subinterpreter for … -
Djangocon EU: when SaaS is not allowed: shipping Django as a desktop app - Jochen Wersdörfer
(One of my summaries of the 2026 Djangocon EU in Athens). He works on "steel-IQ", an open source modelling platform for steel decarbonisation. They knew that they couldn't run it as a web app because of strict security requirements at the end users. So they thought about distributing it as a Python library or as jupyter notebooks. But the users would probably mess it up, so an installable UI was needed. Perhaps we can do it with django? The first working version was easier than expected. They used "Electron" to get an installable app that showed a web interface. You'd start django inside the process, wait until it responded and then show the web interface as usual. So: electron + django + sqlite. The actual Steel-IQ app is full of steel terminology. Not everyone has a blast furnace in the back yard, so he created a sample project that's simpler: https://github.com/ephes/desktop-django-starter The components: Electron: main.js nodejs program. Django server. BrowserWindow: a chromium renderer, this is what the user sees. Django workers: for the background simulation work. Shared data layer: sqlite + filesystem. The sqlite database is also used by the DatabaseBackend of django-tasks. This means you can run background tasks … -
Djangocon EU: lightning talks (day 2)
(One of my summaries of the 2026 Djangocon EU in Athens). Developing Django's community - Andy Miller Andy likes these conferences. But getting here and attending costs at least €1000. So conferences are limited to those that can afford it. The new online community working group that wants to improve the online possibilities of gathering, as those are available to everyone. Perhaps new virtual social events. Better feeds of what's happening in the community. So: improve the community for everyone. More info: https://github.com/django/online-community-working-group To JWT or not to JWT - Benedikt JSON web tokens are not a one-size-fits-all solution. JWT is a bas64 encoded string with three parts: header, payload, signature. Marketed as stateless, but revocation always adds state. Why would you want to use it? Well, third-party identity providers often give you one. And: you can save database queries by embedding info in the token. And you can use it for offline mode in mobile or desktop apps. But there are drawbacks. Some reasons for using something else: JWTs are immutable, data remains valid until expiration even when the data changes server-side. Stateless revocation is impossible. Logout-from-all-devices requires tracking state, defeating the process. JWT if your provider uses them. … -
Djangocon EU: advanced ORM kung-fu - Mathias Wedeken
(One of my summaries of the 2026 Djangocon EU in Athens). Full title: advanced ORM kung-fu for on-demand filtering, sorting, and summing 40 million financial transactions. He's working on a property management platform (so: buildings, rent payments, extra costs, maintenance, grouping per housing complex, etc). 300000 users. 472000 financial accounts. 40 million transactions. Users expect real-time filtering, sorting and summing. But originally his website often had "please wait for 10 seconds" spinners. This should be improved. A colleague told him that the database ought to be able to handle everything just fine. So the goal was to fully leverage postgresql through Django's ORM without writing raw SQL. Some things he discovered: Annotations are composable. Almost functional programming. Func(template=...) to drop custom SQL expressions into the ORM. You can use them to group items in a custom way, for instance. In JSONB, you can use __0 to grab the first element of a list. Use that before using raw SQL. Materialized views (note: use "managed=False") means you have pre-computed data available, usable just like a model. You do have to handle those views (create, refresh) yourself, though. Coalesce is something he mentioned and it looked useful, but I have to check … -
Django Tasks - Jake Howard
🔗 Links django-tasks and Jake's GitHub Jake's personal website DSF Member of the Month - Jake Howard DjangoCon Europe 2024: Empowering Django with Background Workers Django Forum - Steering Council Vote on Background Tasks PyCon UK 2025 Talk: Halt and Catch Fire: Forcefully Stopping Python Wagtail new security announcements channel Django new features repo Carlton’s Talk at PyTV on Mantle 📦 Projects microgpt Django-Mantle Django-Mantle-DRF 📚 Books The Passage by Justin Cronin Solar Power Finance Without the Jargon by Jenny Chase Designing Data Intensive Applications by Martin Kleppmann 🎥 YouTube YouTube 🤝 Sponsor This episode was brought to you by Buttondown, the easiest way to start, send, and grow your email newsletter. New customers can save 50% off their first year with Buttondown using the coupon code DJANGO. -
Djangocon EU: static islands, dynamic sea - Carlton Gibson
(One of my summaries of the 2026 Djangocon EU in Athens). PEP 484, about type hints: Python will remain a dynamically typed language, and the authors have no desire to ever make type hints mandatory, not even by convention. Well, that last part seems to be be a bit more nuanced nowadays. Dynamic sea Django does not have type hints. Django predates type hints. But as Django and as a Django add-on author, you encounter lots of pressure to "just" add it. What about the "not even by by convention"? Django has 20+ years of keeping the dynamic stuff in check. Experience in validating, in cleaning inputs. And it uses conventions: everyone knows that a view takes a request and everyone knows what it does. According to Django's design philosophies: Django should take full advantage of Python's dynamic capabilities. It should reduce boilerplate, by using Python's dynamic possibilities to its advantage. Conventions are handy and can be build into editors. But the editor's work is made easier with type hints: you now have three LSP, language servers, that can use the type hints to give you feedback. Hence the popularity. But is it still powerful, dynamic Python when we enforce … -
Djangocon EU: Oh, I found a security issue - Markus Holtermann
(One of my summaries of the 2026 Djangocon EU in Athens). Markus is member of the Django security team. The important document is https://docs.djangoproject.com/en/dev/internals/security/ , how to report security issues, how the security team will evaluate it, which versions will include a fix (if needed) and how it gets disclosed. If you think you found an issue? Mail it to security@djangoproject.com. Don't start off writing lots of text, just provide a brief description and how to reproduce it. A fix is even better. And: don't report issues that are corner cases that go against normal web development and regular Django practice. If you take unfiltered, unvalidated user input and manage to do code injection: well, don't do that :-) The security team triages the issue. If it is valid, they try to fix it. And if there's a fix, they check it with the original reporter. Such development doesn't happen in public, of course. If there's a fix, they assign the issue a CVE number. Since last year, the Django project is its own (and only) CVE assigner. And they prepare the various Django version releases beforehand. Then the problem + the releases with the fixes are announced. Mailinglist, news … -
Djangocon EU: ATLAS, case study of Django in the public sector - Georgios Poulos
(One of my summaries of the 2026 Djangocon EU in Athens). Full title: ATLAS: building a zero‑budget IT service management platform with Django in the public sector. Georgios likes Django because it inspired him to think clearly about structure, workflow and architecting real-world systems. Projects don't fail because of technology. They fail because workflows are not clear and because the system doesn't show what is happening. Clarity is what you need. Meaningful metrics. Maintainability. The area for which he build the Atlas system was IT support. IT support originally was done by email and phone calls: completely unstructured. They now support 20500 employees... The problem: scaling without a system. Who owns what? Who's looking at what issue? The real problem was unstructured requests and lack of accountability. No visibility of the process, so you can only react. Atlas solves it by having a central Django workflow system. The user starts with a single form they need to fill in. Simple: fewer choices, fewer mistakes. Predictablility counts for a lot in internal systems. Workflow states are central. New/assigned/in progress/waiting/closed. Tickets move between those state based on explicit business rules. And timers to watch out for tickets being in the same state … -
Djangocon EU: AI-assisted contributions and maintainer load - Paolo Melchiorre
(One of my summaries of the 2026 Djangocon EU in Athens). Paolo is very active in the Django community. He's seeing more and more problems crop up for maintainers, related to AI-assisted contributions. He showed two quotes that seem to be about AI, but were really about something else: "It cripples the mind": Edsger Dijkstra (shortest path algorithm creator) in 1975, talking about the Cobol language. "You can't trust code that you didn't totally create yourself": Ken Thompson (Unix creator), talking about code within his own company. New technologies aren't always welcomed with open arms. He then showed an AI-adjusted/improved image of Django-the-guitar-player. With six fingers on his left hand and a too-modern guitar and amplifier. Amplification: that's what might happen with Django: More contributors, but also more low-value contributions. More code, but also more untested code. What will happen? He showed some examples from other projects. Being swamped with low-quality pull requests, for instance. Within the Django community, the jazzband project is stopping: there were more reasons, but "AI slop" was one of them. In matplotlib, an AI pull request was closed. Then the AI bot wrote a blog entry complaining about it and started attacking the open source … -
Djangocon EU: reliable Django signals - Haki Benita
(One of my summaries of the 2026 Djangocon EU in Athens). He's going to talk about: A pattern for decoupling modules in complicated systems Reliable and fault-tolerant workflows in your elaborate Django apps. (A workflow is a set of actions, like "select product", "place order", "pay"). For the payment example, you probably use a third party. You create a payment in the third party payment processor. The user provides details at the processor. After some time, the payment processor sends back some completion information. The completion info can contain "succeeded" or "failed". Handling the order is a bit more complicated. You have the order itself with its own workflow ("placed", "payment_succeeded", "sent", "received"). But this workflow also depends on the payment workflow. So two processes intertwined. Both have a webhook ("order placed" and "third party processor finished"). When the payment processor is finished, the webhook for the payment cannot normally talk to the Order model. If Order needs to talk to Payment and Payment to Order, you get circular dependencies. You can work around it, but this example only has a two-way relation. In a real order+payment example you also have refunds, customers and lots more. You get spaghetti code. …