Django news (unofficial)
Django news (unofficial)djangonews@socialhome.network
2025-08-30

DSF member of the month - Lilian

For August 2025, we welcome Lilian as our DSF member of the month! ⭐

Lilian contributes to the community by writing blog posts, being active in the Django forum and participating in code reviews with the Space Reviewers. Starting as a participant in the first Djangonaut Space session, she progressed to become both a Captain and Session organizer. She has been a DSF member since March 2024. Lilian is looking for new opportunities!

You can learn more about Lilian by visiting Lilian's website and her GitHub Profile.

Let’s spend some time getting to know Lilian better!

Can you tell us a little about yourself (hobbies, education, etc)?

My name is Lilian and I started contributing to Django during the sprint days of DjangoCon US 2023. I continued contributing through the Djangonaut Space program, where I've been involved as a mentee, a mentor, and a session organizer. I love the impact the program brings to Django and how it has helped so many individuals in various ways. My hobbies include cooking and sharing meals with my friends and volunteering at local events.

I'm curious, where does your GitHub nickname come from?

Haha, towhee is a bird and I just prefixed it with the preposition “on”.

How did you start using Django?

I had a project from a client where there was an existing website that was built in PHP. The client wanted to add new features. At the time, I was mainly using Flask for other projects, but I started seeing Django rise in popularity. I evaluated PHP and Django, and I chose Django for its security features. The fact that it was in Python also meant I could develop the new features pretty quickly. The project ended up being a hybrid of PHP and Django with Apache server routing different pages to each application.

What other framework do you know and if there is anything you would like to have in Django if you had magical powers?

I've worked with Flask and SQLAlchemy. I like that SQLAlchemy comes with an ORM, but you can still build queries without it. I like that its queries resemble SQL. In Django, I would like to have a way to write CTEs without resorting to raw SQL and losing the mapping between data and objects. There is the django-cte library, but constructing the queries can still be challenging to me. There’s definitely a tradeoff. However, I don’t know if asking Django to support CTEs is the answer.

What projects are you working on now?

I'm building an ELT (Extract, Transform, Load) pipeline to pull data from multiple sources and run analyses. I'm learning tools like dbt (data build tool) and Airflow to orchestrate the data transformation. It's very interesting to use a framework for managing data.

What are you learning about these days?

I'm learning about databases. I’ve always been curious about their implementation. When I worked on tickets for Django’s ORM, the comments and code reviews from Simon Charette showed me where to look for information, and that got me to dive in further. I participate in the Postgres Patch Review Workshop to review patches, and Andy Pavlo’s lectures are a great source to learn from too.

Which Django libraries are your favorite (core or 3rd party)?

One of my favorite libraries is django-extensions, because it has many useful commands, including the graph_models command that generates ERDs, which helps me navigate the data models in larger projects.

My other favorite libraries are django-allauth and django-rest-framework, because I use it in pretty much every project.

What are the top three things in Django that you like?

I like Djangonaut Space, the community, and the documentation.

You've shown a lot of interest in the contribution process lately, could you share a bit more what you are trying to do and what your goal is?

Django is known for having a high barrier to entry when it comes to contributions and it can have long turnaround times. Djangonaut Space is trying to change that by having mentors guide people through the process and help with code reviews.

How can we expand this effort to make onboarding new contributors easier?

What are some low hanging fruits that will make contributing to Django a more intuitive and pleasant experience?

Areas I’m exploring include:

  1. Make the ticket lifecycle more prominent. Make the queues easy to access, and ensure a ticket will get attention from the right people.

  2. Gain insights into contribution bottlenecks so DSF Board and Working Groups can make better decisions on where to allocate funds and resources.

  3. Provide recognition for work done beyond the PR authorship to encourage continued involvement.

You have taken part of Djangonaut Space program in many ways, do you have any advice or thing to mention for people hesitant to apply to the program for the future session?

For anyone who is hesitant, check out the media page to learn about past participants' experiences. Check out the AMA video and many other videos on the YouTube channel to learn more about the program. There are many opportunities to try new things and learn new skills in open source, and Djangonaut Space is a great place to get started. You'll meet and work with people from all around the globe, which is pretty awesome!

What do you do for fun outside of programming?

I am trying new things! I’m volunteering at a community run radio station, where I’m learning to operate the video cameras during live mic events and training to become a DJ. It’s pretty cool meeting bands from all around the world.

Is there anything else you’d like to say?

I'm extremely grateful for the Djangonaut Space program and the Django community!

Thank you for doing the interview, Lilian !

https://www.djangoproject.com/weblog/2025/aug/30/dsf-member-of-the-month-lilian/

#django #python #webdev

Django news (unofficial)djangonews@socialhome.network
2025-08-13

Building better APIs: from Django to client libraries with OpenAPI

tl;dr

A summary of resources and learnings related to building REST API I put together over the last couple of years. Complete API development workflow from Django backend to frontend clients using Django REST Framework, drf-spectacular for OpenAPI spec generation, and automated client generation with openapi-generator. Big productivity boost!

There is a lot of discussion about frameworks for building REST APIs, some of them being even able to generate OpenAPI specs directly for you. Django is not quite known for that, but there are ways of doing this by automating most of the process while being very productive and offering your team a clean developer experience.

Overview

The stack I prefer makes use of several additional modules you will require: django-rest-framework and drf-spectacular alongside Django. REST Framework helps you extend your application in order to have a REST API, while drf-spectacular will help you the ability to generate the OpenAPI spec (standalone post: Create OpenAPI spec for Django REST Framework APIs.

After having the OpenAPI spec, you can generate clients with openapi-generator. Here is an example I mapped out of generating an Angular client:

Step-by-step process

There is also a recording from my GLT 2025 talk where I summarize most of these ideas.

<figure> <figcaption>Building Better APIs - From Django to Client Libraries with OpenAPI</figcaption> </figure>

In case you want to follow along, here is a step-by-step guide from the repository I showed during the presentation:

From the last step, you can generate the API clients for the platform you require. You can follow the README and the examples available in my glt25-client repository.

Maintaining compatibility over time

The final tool you can use is openapi-diff, which will help you keep your documentation compatible. This is very important once your REST API is used in production:

Example of a compatible change: glt25-demo v1 to v2

docker run --rm -t openapitools/openapi-diff:latest https://github.com/nezhar/glt25-demo/releases/download/v1/openapi.yaml https://github.com/nezhar/glt25-demo/releases/download/v2/openapi.yaml

Example of a breaking change: glt25-demo v2 to v3

docker run --rm -t openapitools/openapi-diff:latest https://github.com/nezhar/glt25-demo/releases/download/v2/openapi.yaml https://github.com/nezhar/glt25-demo/releases/download/v3/openapi.yaml

Automating the maintenance

The process can be automated even further using GitHub Actions and Dependabot. Here are what the steps look like with this full continuous delivery setup:

Takeways

Building a complete API development workflow from Django to client libraries using OpenAPI creates a powerful and maintainable development experience. By combining Django REST Framework with drf-spectacular for automatic OpenAPI spec generation and openapi-generator for client creation, you can eliminate manual API documentation and reduce integration errors.

If you want to go even further, you can automate the integration of error codes inside the OpenAPI spec. This way you can better support languages that are even more strict when consuming the REST API!

Thank you to Harald Nezbeda for proposing this guest post on the Django blog!

https://www.djangoproject.com/weblog/2025/aug/13/building-better-apis-django-to-clients-openapi/

#django #python #webdev

Diagram of the flow from OpenAPI, to code via openapi-generator, then npm publish, live on npm, them npm install api-client, then AngularBuilding better APIs from Django to Client Libraries with OpenAPI by Harald Nezbeda
Django news (unofficial)djangonews@socialhome.network
2025-08-11

Welcome Our New Fellow - Jacob Tyler Walls

We are pleased to welcome Jacob Tyler Walls as the newest member of the Django Fellowship team. Jacob joins Natalia Bidart and Sarah Boyce, who continue in their roles as Django Fellows.

Jacob is a full-stack developer and open-source maintainer with five years of experience using and contributing to Django. He got involved in open source thanks to music technology. After majoring in music and philosophy at Williams College, Jacob earned a Ph.D. in music composition from the University of Pennsylvania. Programming coursework both fed into his creative output and also led to roles as a Python generalist working on music information retrieval and as a developer for an interactive music theory instruction site using Django.

As a member of Django’s Triage & Review Team, Jacob is passionate about software testing and eager to pay forward the mentorship he received as a contributor. Jacob also co-maintains the Python projects music21 and pylint.

Most recently, as part of his work as a core developer of Arches, an open-source Django/Vue framework for managing cultural heritage data, Jacob had the opportunity to explore the expressive potential of Django’s ORM. He gave a DjangoCon talk on his experience adapting QuerySets to work with highly generic data access patterns and an analogous talk for an audience of Arches developers. Since 2022, he has focused on developing GIS-powered Django apps at Azavea and later Farallon Geographics.

When time permits, Jacob continues to teach music theory, including most recently as an adjunct faculty member at the University of Delaware. (Perhaps another time Django Reinhardt will end up on the syllabus.)

You can find Jacob on GitHub as @jacobtylerwalls and follow occasional musical updates at jacobtylerwalls.com

Thank you to all the applicants to the Fellowship. We hope to expand the program in the future, and knowing there are so many excellent candidates gives us great confidence as we work toward that goal.

https://www.djangoproject.com/weblog/2025/aug/11/welcome-our-new-fellow-jacob-tyler-walls/

#django #python #webdev

Django news (unofficial)djangonews@socialhome.network
2025-08-09

Django’s accessibility contributing guide

The Django accessibility team is excited to announce that our accessibility contribution guidelines are now live in the documentation 🎉

These new guidelines are designed to support contributors in making Django more accessible to all users — including those who navigate the web using screen readers, keyboard-only inputs, and other assistive technologies.

They outline practical steps for designing and testing accessible user interfaces, how to contribute, follow up on ongoing accessibility issues, and contact the team. For beginners, we also recommend resources like The A11Y Project to get started.

We welcome your feedback and contributions as we continue to improve accessibility across the Django ecosystem! Come say hi on the Django Forum: Accessibility contributing guide.

https://www.djangoproject.com/weblog/2025/aug/09/django-accessibility-contributing-guide/

#django #python #webdev

Four Django ponies flying in the clouds around the Django logo. One has a leg in a cast, one has dark glasses and a cane, one is in a wheelchair, and one has a hidden disability sunflower. The ponies are white, with purple highlights and pink mane and hooves. They have wings and are smiling
Django news (unofficial)djangonews@socialhome.network
2025-08-06

Django bugfix release issued: 5.2.5

Today we've issued the 5.2.5 bugfix release.

The release package and checksums are available from our downloads page, as well as from the Python Package Index.

The PGP key ID used for this release is : 3955B19851EA96EF

https://www.djangoproject.com/weblog/2025/aug/06/bugfix-releases/

#django #python #webdev

Django news (unofficial)djangonews@socialhome.network
2025-08-03

DSF member of the month - Jake Howard

For July 2025, we welcome Jake Howard as our DSF member of the month! ⭐

Jake actively shares his knowledge through blog posts and community talks. He is part of the Security Team Working Group and he created the DEP 14. He has been a DSF member since June 2024.
You can learn more about Jake by visiting Jake's website and his GitHub Profile.

Let’s spend some time getting to know Jake better!

Can you tell us a little about yourself (hobbies, education, etc)

I’m Jake. I’m a Senior Systems Engineer at Torchbox, where I’ve been for a little over 4 years. “Systems Engineer” is a fairly loaded title, and means different things to different people. I like to describe it as doing everything technical to do with Software Engineering which isn’t Programming (Sysadmin, Devops, IT support, Security, Networking), but also doing a fair bit of Programming.

Most of my hobbies revolve around technology. I’m an avid self-hoster, running applications on servers both in “the cloud” and in my house. There’s been a server of some kind in my house for the last 10 years. I’m generally quite a private person, so I like to know what’s happening to my data. Since I started working remotely at the start of the 2020 pandemic, I’ve channeled some of this passion into posts on my website, with posts about all manner of things I’ve done from self-hosting to general software engineering.

Away from my desk (sort of), I’m a volunteer for Student Robotics, inspiring college students into STEM through competitive robotics (no, not quite like Robot Wars). In school, I was always the quiet one, but now I seem completely at home with public speaking, commentary and otherwise being in front of large crowds of people. I wish I knew the secret - I’d make millions!

My GitHub is also pretty active, with contributions all over the place (OpenZFS, Nebula VPN, Gitea, Plausible Analytics, OpenCV, Ansible…).

I’m curious, where your nickname “RealOrangeOne” comes from?

Because a lot of life happens online (especially in the last 5 years), many people haven’t even seen pictures of me, let alone met me in person. I am not in fact a talking piece of fruit. For a while, I tried to stay anonymous, avoiding photos or videos of me on the internet. But since I discovered I enjoy public speaking, I’ve sort of given up on that (for the most part).

By now, I’m sure many people have speak. But, for those who don’t know: I, like my father before me, am ginger 🔥 (the hair colour, not the plant).

The exact specifics of how being ginger lead to “TheOrangeOne” are sadly lost to time. I’ve owned theorangeone.net for well over a decade at this point. Unfortunately, it’s not a particularly original nickname, and I have to be fast to claim it when signing up to new services. In some places (where I wasn’t fast enough) I’m forced to sub out “The” for “Real”, which has lead to some confusions, but not too many. Canonically, I prefer “TheOrangeOne”, but as we all know, naming things is hard.

How did you start using Django?

I’ve been using Django since around the 1.8 release. My job at the time was at a Django development agency, so it was the first real Python framework I’d used. The first few weeks there was my first exposure to Django, pip, package management and collaborative software engineering - it was quite a lot to learn at once. I didn’t realise it at the time, but I was working working as a junior alongside a couple fairly well-known names in the Django community like Tom Christie (DRF, Starlette, HTTPX) and Jamie Matthews (django-readers, django-zen-queries). We mostly built single-page apps with React, so I learned Django and Django Rest Framework at the same time, which means I now often have to look back at the docs to remember how forms and templates work.

As for contributing to Django, that came much later. My first commit to Django was in May 2024. Having used Django for a while, and written plenty of packages, I’d never stopped to look at how upstream was developed. Around the time of DEP 14 kicking off, I needed to look a bit more at the inner workings of the Django project, to learn what was in store for me. When scrolling through Trac tickets, I found an interesting looking ticket, and got to work. At the time of writing, I’ve now closed 9 Trac tickets across 12 PRs, and some pretty cool features (simple block tags, better Accept header parsing, performance improvements to the URL router) now have my name on them (metaphorically speaking).

I wouldn’t call myself an “active” contributor, but I try and keep an eye on the tickets and forum threads which interest me the most, and chime in when I can.

What other framework do you know and if there is anything you would like to have in Django if you had magical powers?

Since it’s the first framework I learned, and so far has done everything I need, I’ve mostly used Django. For a few smaller services, I’ve leaned more towards Starlette and AIOHTTP, but for anything even slightly large I’ve just used Django - since I’d end up recreating much of Django using the smaller frameworks anyway. A better (likely official) path for single-file Django (ie without some of the magic module handling) might help draw a few more people in and fill a few more of these “micro-service” style use-cases.

I’m a class-based views person - I like the encapsulation and easy extension of base views. As with any opinion on the internet, I’m sure many people disagree with me, but to me it’s just personal preference. I’m still surprised it’s a pattern not seen by many other Python frameworks.

Following in the footsteps of Python, I often wonder if Django could also do with some dead battery removal (or at least extracting into separate packages). Django is a pretty big framework, and whilst the contrib apps are intended to be separate, they also require hooks and assumptions in other areas of the codebase. I might be wrong (it happens quite a lot), but I suspect some of those packages would be better suited externally, perhaps improving some developer momentum - and lightening the load for the Fellows. Django’s sitemap and syndication (RSS) frameworks are 2 places I wish would get some more love.

Outside of Python, I’m a big fan of Rust (as cliche as it may be). Whilst Rust is a popular language, there isn’t really a “Django” like (batteries included) framework - it’s all composing the pieces you need yourself. However, that doesn’t stop people being very productive with it. As a result, most of the frameworks have very generic interfaces, letting developers pass state around as needed, rather than trying to do everything themselves. Outside of the obvious static typing debate (which I’m in favour of), I’d love to see Django embrace some dependencies, especially if they bring some performance improvements. It may end up being a bad idea, but it might also help those who want to use Django’s modules outside of Django.

Many years ago, I tried to be a polyglot - switching between different programming languages (and frameworks) to find new ways of working and match the problem to the correct solution. Now, I’ve settled mostly on Python and Rust. They fit my needs well, I’m very productive in them, and between the 2 there’s not much they can’t handle. Given my background, and the fact most sysadmin-y tools are written in it, I’m really not a fan of Go.

What projects are you working on now?

Over time, I’ve slowly stepped back from having big side projects - being a new dad sure takes up time and energy. Large projects ended up feeling too much like work outside of work, and I end up either getting distracted or bored. After work, I want to do something fun, not that seems like yet another job. I’m the kind of person who gets the sudden urge to research something interesting for an evening, dive in, then not think about it again for several weeks. It’s not the most productive way of doing things, which is why my posts are all over the place, but it doesn’t feel much like work for me - I lean heavily on what interests me at any time to drive what I want to do.

With that said, I’m currently in the process of rebuilding my website. Of course, both the current and new versions are built on Django, but the new build should be easier to maintain, faster, and hopefully won’t need rewriting again in just a couple years. Most of my other projects have been small tools to make my home server that bit nicer.

Professionally, I’m not really a developer anymore. As a sysadmin (ish), much of my day-to-day doesn’t involve much programming. I spend much more of my time deploying, monitoring and administering Django applications than I do writing them. My main project at the moment is helping port a large Java / JS deployment over to Django and Wagtail, running on Kubernetes with some very high and interesting stability and scaling requirements. Since most of my professional live has been at software agencies, I’ve tended to bounce between different projects, rather than sitting on a single one. So I’m also supporting on a few other smaller projects as and when I’m needed.

Which Django libraries are your favorite (core or 3rd party)?

django-tasks, of course!

Oh right, a serious answer…

I have to say, one of the most underrated modules in Django is django.utils. It’s not as glamourous as the ORM, forms or cache, but it’s a treasure trove of useful methods. I personally always like looking at the internal helper functions large frameworks use - see the problems they’ve had to solve time and time again. Whilst there’s not the same stability guarantees, I’ve definitely been helped out on a few occasions by some undocumented functions.

In that theme, I’m a fan of libraries which do one thing and do it well. I quite like small libraries which aim to solve a problem. There’s definitely a line before that becomes a problem (anyone remember left-pad?), but libraries which scope creep are often harder to work with than the more narrow-scoped ones, whilst the smaller ones just keep on working and making my life easier. For example, django-environ makes reading and parsing environment variables into settings really easy and clean, and django-decorator-include helps including other urlpatterns whilst wrapping them in a decorator - particularly helpful for 3rd-party package’s URLs.

Finally, I’ve got a real soft-spot for whitenoise (and ServeStatic for ASGI users). Django’s documentation deters people pretty hard from serving media and static files using Django - and rightly so in performance-critical environments. However, for most people, having to additionally maintain (and secure) nginx is more maintenance than necessary. whitenoise serves static files using Django directly, without any extra configuration, whilst also pre-compressing files for a nice performance boost. To me, it’s such a universally-useful library, I’d love to see it it included in Django itself someday.

I’ll throw a bonus shout out for granian, a new (ish) WSGI / ASGI server written in Rust. gunicorn has a near monopoly on running Python apps in production, especially in the WSGI space, so it’s nice to see a newcomer. granian isn’t always faster, but doing the HTTP handling in Rust (and using popular libraries to do it) can improve stability and throughput, without holding the GIL. I’ve not run anything in production with it yet, but I’ve been using it on personal projects for almost a year without issue.

What are the top three things in Django that you like?

Contrary to what I’ve already said, I actually like Django’s batteries. Sure, there’s quite a few “dead” ones in need of some cleaning up and TLC, but having most of what I need already installed makes me far more productive. I don’t need to think about how to render my form on the page, save the results as a model, or properly handle errors - everything “just works”, and works together. Sure, batteries have their downsides - it makes swapping them out rather difficult, but I’d rather ship my feature sooner than compare the trade-offs of different ORMs. The auto-reloading in django-tasks is only around 8 lines of code thanks to django.utils.autoreload being so easy to hook in to.

Secondly: Forms, but not for the reasons you might think. Most forms are created to take submissions from the user, validate them, then probably save them to a model. However, they’re great as general data validation. I’ve written plenty of views with complex querystring requirements, and leaning on forms to validate them saves a lot of boilerplate code. Sure, pydantic might be a bit faster and have more features, but given I’m already productive with django.forms, and it’s already installed and well understood by other developers in my team, I don’t feel the need to reach for something else.

Finally, I wouldn’t say it’s quite a “favourite”, and it’s well-known as being far-from-perfect, but I’ve got a real soft-spot for the Django Admin. It lets me focus on building the core of an application, rather than the internal interface - particularly when there are no strong requirements for it, or it’s only going to be used by me and a few others. Since it’s a fair raw view of the database by default, I’ve definitely been bitten by some less-than-restrictive permissions, but there’s generally all the hooks I need. I don’t like building frontends, so only needing to build 1 rather than 2 makes me a lot happier, especially if it comes with authentication, permissions, read-only views and a dark mode 😎!

How did you join the security team?

I’d love to say it’s an interesting story, stroking my ego that I saved the day. But the reality is, as usual, far less glamorous.

As an engineer, I’ve tended towards 2 specialties: Security and Performance, which usually go hand-in-hand. In early 2023, I was invited to join the Wagtail CMS Security team after reporting and subsequently helping fix a memory exhaustion issue. I was already involved in all things security at Torchbox, especially our ISO-27001 certification, so I was already known when I submitted a vulnerability report.

Thibaud mentioned to me late last year that the project potentially looking for new members of the security team, to help with resourcing and some potential process improvements within the foundation. I naturally jumped at the opportunity - since the team is generally closed to new members and “fully-staffed”. After a few gentle reminders (he’s a busy guy), I received a message from Sarah formally inviting me in March.

Since then, I’ve tried to review every report which came through, and helped author a few patches. A few reports even had to be raised upstream with Python’s Security Response Team (PSRT). It’s been an interesting experience, and I’m looking forward to seeing how the team developers over the coming years.

I’m aware that you have created DEP 14 on the Background Workers, how the work is going so far? Do you need support from the community on anything?

DEP 14 (the proposal to add a native background workers API to Django) has been a really interesting journey. I’m beyond humbled to see the community interest behind it. When I started down this road, I’d only intended to start the conversations and help rally the community interest. Since then, and 6000 lines of code later, I’m mostly single-handedly writing a database-backed production-grade task system.

Right now, we’re at a bit of a cross-roads. Many of the foundational parts work, relatively well. The difficulty comes with the more complex features: Retries, dependencies, robust execution. Building a task system is easy - building a reliable one people want to actually use is incredibly difficult. If anyone out there is interested in getting involved, please do! Report issues, fix bugs, contribute to design discussions. Most of the APIs are based on what I think looks sensible. Software this large, pivotal and complex can’t be built in isolation - so it needs a diverse audience to ensure we (I) make the right decisions, and design an API people actually want to use that will last and scale for years to come.

The next challenge on my list to tackle is timeouts - a highly requested feature. It sounds simple, but the reality is far from it. Many of those challenges sparked the topic of my upcoming PyCon UK talk later this year.

Django is celebrating its 20th anniversary this month. Any nice story to share?

My personal highlight was DjangoCon Europe 2024 - my first DjangoCon. I ended up bringing the stereotypically grey British weather with me, but I had a great week chatting Django with some interesting people, and putting faces to the names and handles I’d seen online. After the talk announcing DEP 14 and background tasks, I was inundated with people voicing their support - many wondering how it’d taken this long.

But personally, I’m more interested in what’s to come. Of course, there’s django-tasks, but the next sets of releases are shaping up to be pretty interesting. Over the last 3-4 years or so, I’ve personally noticed a bit of a resurgence in people’s appetites for change in Django. The 6.x Steering Council have a lot of interesting ideas, and clearly the community agree. People are happy with what Django can do now, but want to bring it a little more up-to-date - and are happy to put in the work to do it. Only a few weeks ago, django-csp was included in core, making it easier to make more secure applications. I’m sure that’s just the start. The fact people are still keen on working on a framework which just celebrated 20 years shows it must be doing something right!

Is there anything else you’d like to say?

I’d like to thank whoever nominated me to be a DSF member in the first place. To this date, I have no idea who you are.

Beyond that, I’m just looking forward to seeing what comes of Django, and Python in general over the next few years.

Thank you for doing the interview, Jake !

https://www.djangoproject.com/weblog/2025/aug/03/dsf-member-of-the-month-jake-howard/

#django #python #webdev

Django news (unofficial)djangonews@socialhome.network
2025-07-31

Djangonaut Space is looking for contributors to be mentors

Hello Django 🌌 Universe!

🛰️‍ This is Djangonaut Space phoning home about Session 5! We're recruiting technical mentors (Navigators) to join our next 🌟stellar🌟 mission.

👩‍🚀 We are looking for people who regularly contribute to Django or a Django related package, that want to mentor others. Our next session will be Oct-Nov.

🚀 Come join us and be a cosmic contributor! Express your interest to be a mentor here.

📚 Want to learn more about what it means to be a Navigator:

🤝 Interested people will have to complete a 30 minute meet & greet type interview with organizers.

✋ If you're interested in applying to be a Djangonaut, applications will open and close in September (dates to be determined). The latest information will be posted on our site, djangonaut.space. Please follow our social media accounts or subscribe to our newsletter for announcements.

☄️ We'll see you around the cosmos!

Djangonaut Space session organizers

https://www.djangoproject.com/weblog/2025/jul/31/djangonaut-space-looking-for-mentors/

#django #python #webdev

Django news (unofficial)djangonews@socialhome.network
2025-07-25

DjangoCon Africa 2025 Heads to Arusha 🇹🇿

We’re excited to share that DjangoCon Africa is returning this year — and this time we’re heading to Arusha, Tanzania from August 11–15, 2025! 🎉

Arusha city view with Mount Meru in the background, credits Halidtz - CC BY-SA 4.0

This second edition builds on the incredible success of the inaugural DjangoCon Africa held in Zanzibar in 2023. That event welcomed over 200 attendees from 22+ countries, with more than half of the participants being women — a powerful statement about the growing diversity and strength of the African tech ecosystem.

What to expect at DjangoCon Africa 2025

Five action-packed days of:

  1. 💬 Talks Three full days of diverse talks spanning programming, technology, society, career development, business, education, and more — all with voices from across Africa and around the globe.
  2. 🖥️ Workshops Hands-on training led by Django and Python experts — perfect for deepening your skills and learning new ones.
  3. 🤝 Sprints Join code sprints and contribute to open source projects, including Django itself.
  4. 👩‍💻 Django Girls workshop A special pre-conference workshop for women interested in web development — part of a global initiative that has introduced thousands of women to Django.
  5. 🔍 Discovery & connections Meet developers, designers, educators, and innovators from across the continent. Share stories. Build partnerships. Celebrate African tech talent.

Co-hosting with UbuCon Africa 2025

This year’s DjangoCon Africa comes with a special twist: we’re proud to co-host the first-ever UbuCon Africa — a regional gathering of Ubuntu users and contributors.

From August 13–15, UbuCon Africa will bring together Linux and open source enthusiasts to celebrate people-powered tech, collaboration, and the Ubuntu spirit of “I am because we are.” Whether you're a die-hard Debian dev or just curious about Ubuntu — you’ll feel right at home.

🎟 Secure your spot & get involved

Whether you’re looking to attend, speak, sponsor, or volunteer, DjangoCon Africa has a place for you.

This is more than just a conference. It’s a celebration of community, learning, and open source  built by and for people across Africa and beyond.

Join us in Arusha this August. Let’s shape the future of Django together.

https://www.djangoproject.com/weblog/2025/jul/25/djangocon-africa-2025-heads-to-arusha/

#django #python #webdev

Arusha city view with Mount Meru in the background, taken from a hotel balcony
Django news (unofficial)djangonews@socialhome.network
2025-07-02

Django bugfix release issued: 5.2.4

Today we've issued the 5.2.4 bugfix release.

The release package and checksums are available from our downloads page, as well as from the Python Package Index.

The PGP key ID used for this release is Natalia Bidart: 2EE82A8D9470983E

https://www.djangoproject.com/weblog/2025/jul/02/bugfix-releases/

#django #python #webdev

Django news (unofficial)djangonews@socialhome.network
2025-06-27

Watch the DjangoCon Europe 2025 talks

They’re now all available to watch on YouTube, with a dedicated playlist ⭐️ DjangoCon Europe 2025 Dublin. For more quality Django talks in 2025, check out our next upcoming events!

<li>
  <a href="https://2025.djangocon.us" target="_blank">DjangoCon US 2025</a>
  <span class="meta"><span>Sept. 8, 2025</span>  |  Chicago, Illinois, USA 🇺🇸</span>
  <i class="icon icon-calendar"></i>
</li>

<li>
  <a href="https://2025.djangoday.in/" target="_blank">DjangoDay India</a>
  <span class="meta"><span>Nov. 2, 2025 (tentative)</span>  |  Bangalore, India 🇮🇳</span>
  <i class="icon icon-calendar"></i>
</li>

All the DjangoCon Europe talks

<figure> <figcaption>Welcome Session</figcaption> </figure> <figure> <figcaption>Keynote: Django needs you! (to do code review)</figcaption> </figure> <figure> <figcaption>End-to-end testing Django applications using Pytest with Playwright</figcaption> </figure> <figure> <figcaption>Turn back time: Converting integer fields to bigint using Django migrations at scale</figcaption> </figure> <figure> <figcaption>Data-Oriented Django Drei</figcaption> </figure> <figure> <figcaption>The fine print in Django release notes</figcaption> </figure> <figure> <figcaption>Django + HTMX: Patterns to Success</figcaption> </figure> <figure> <figcaption>How to solve a Python mystery</figcaption> </figure> <figure> <figcaption>Bulletproof Data Pipelines: Django, Celery, and the Power of Idempotency</figcaption> </figure> <figure> <figcaption>Logs, shells, caches and other strange words we use daily</figcaption> </figure> <figure> <figcaption>Day 1 Lightning Talks</figcaption> </figure> <figure> <figcaption>How to Enjoy Debugging in Production</figcaption> </figure> <figure> <figcaption>KEYNOTE: The Most Bizarre Software Bugs in History</figcaption> </figure> <figure> <figcaption>Passkeys in Django: the best of all possible worlds</figcaption> </figure> <figure> <figcaption>How we make decisions in Django</figcaption> </figure> <figure> <figcaption>100 Million Parking Transactions Per Year with Django</figcaption> </figure> <figure> <figcaption>One more time about µDjango</figcaption> </figure> <figure> <figcaption>Steering Council introduction</figcaption> </figure> <figure> <figcaption>Supporting Adult Career Switchers: The Unbootcamp Method</figcaption> </figure> <figure> <figcaption>How to get Foreign Keys horribly wrong in Django</figcaption> </figure> <figure> <figcaption>Zango: Accelerating Business App Development with an Opinionated Django Meta</figcaption> </figure> <figure> <figcaption>Dynamic models without dynamic models</figcaption> </figure> <figure> <figcaption>Evolving Django: What We Learned by Integrating MongoDB</figcaption> </figure> <figure> <figcaption>Feature Flags: Deploy to some of the people all of the time, and all of the</figcaption> </figure> <figure> <figcaption>Day 2 Lightning Talks</figcaption> </figure> <figure> <figcaption>KEYNOTE: Django for Data Science: Deploying Machine Learning Models with Django</figcaption> </figure> <figure> <figcaption>The incredible Djangonaut Space project</figcaption> </figure> <figure> <figcaption>Anatomy of a Database Operation</figcaption> </figure> <figure> <figcaption>One Thousand and One Django Sites</figcaption> </figure> <figure> <figcaption>Django Admin at Scale: From Milliseconds to Microseconds 🚀</figcaption> </figure> <figure> <figcaption>Just-in-Time Development with Django and HTMX: Faster, Leaner, and Smarter</figcaption> </figure> <figure> <figcaption>Europe, Django and two-factor authentication</figcaption> </figure> <figure> <figcaption>Closing session</figcaption> </figure> <figure> <figcaption>Day 3 Lightning Talks</figcaption> </figure>

https://www.djangoproject.com/weblog/2025/jun/27/watch-the-djangocon-europe-2025-talks/

#django #python #webdev

Django news (unofficial)djangonews@socialhome.network
2025-06-17

DSF member of the month - Elena Williams

For June 2025, we welcome Elena Williams as our DSF member of the month! ⭐

Elena is a dedicated member of the Django community. She is part of the Code of Conduct Working Group and she is a Django Girls organizer in Australia. She has been a DSF member since July 2014.
You can learn more about Elena by visiting Elena's website and her GitHub Profile.

Let’s spend some time getting to know Elena better!

Can you tell us a little about yourself (hobbies, education, etc)

My background is that I was always interested in computers, though my parents were more creative types, my Dad was an Architect (of built structures). When I was a kid we had computers for CAD around the house before it was common. I was always into STEM subjects, but unfortunately in that era for girls to do engineering it was a bit too hostile for me, so I trained in finance instead and worked in that industry (finance and banking, MNE orgs) for nearly a decade. I kept coming back to coding and was always building computers, and was obsessed with the internet as a technology from pretty early on. Just after I discovered Django I did a Masters in Computing at ANU. To this day my main hobbies are programming/webdev (very much a person who codes for fun) and the open source community. My persistent other hobbies are hackspace activities, I like CNC and laser stuff, but will pick up any and all tools/mediums and give them a go, lately been spending time with blender and cabinetry. When I can, I like to get away to snowboard or kitesurf, and this wild Australian long distance endurance navigation sport called rogaining. Really at the moment I’m mostly focussed on being a parent (which is an awesome experience), my friends (mostly python related), my job and working on the community here in Australia. With my family we go camping/hiking more than most. I’ve also continued to be a sessional academic at ANU teaching software engineering for many years.

How did you start using Django?

Golly, I’ve been using Django forever. I’d started doing web stuff in the early ‘00s and worked in a range of languages and paradigms. I was working in a physics research institute at a high profile university in Australia doing web stuff and made friends with a bunch of the doctoral students. In around 2007, one of these students, and my good mate, Dave, randomly recommended this new framework Django and Python (and emacs also actually but that’s a different story). Basically I got into it immediately and never looked back and went on to build a career around Django (actually Dave later gave up physics and did the same thing too). I’ve been engaged with the Python and Django communities to varying degrees since about 2011 as well. To be honest when I discovered the language and the framework I really didn’t expect to still be passionate about them all these years later but I really am! Hopefully I can continue to be well into the future also.

What other framework do you know and if there is anything you would like to have in Django if you had magical powers?

Over the years (being a curious person) I’ve worked with many many web frameworks and technologies, the vast majority of the big ones. In recent years I’ve been spending time with FastAPI and SQLAlchemy as well as non-python technologies. Django is better though.

Not using Django as much at the moment makes me love it even more and realise how lucky we are with such a well designed and well supported framework. It’s not perfect but it’s outstanding.

Having said that: at a technical level I’d love to have “cheaper” ways (in every sense) to deploy. Even though deployment methods have changed beyond recognition several times over the years, I always thought this would get easier over time and am kind of surprised that it hasn’t.

Very specific to me is that I need Django to have stronger support for many database schemas in the same project, but honestly this is just a specific problem I have inherited in a project at the moment, but it’ll pass eventually.

What projects are you working on now?

Over the last few years I’ve helped organise a number of events, including PyConAU, though realised I’d been taking on too many projects and trying to pull back actually! Still: Internationally I’m on DSF CoC with a great team. Nationally this year I’ve been serving on the committee of our main Australian open source foundation body, Linux Australia, as well as working in a small team trying to bring together all of the Australian python user groups under a banner we hope to call Python Australia and I’ve had a keen interest in python user groups around the world. In my home town I’ve been organising our local user groups for some time with an awesome team, as well as our fantastic local PyLadies.

For work I’m flat-chat working in a senior role on a Platform team in a small data company that provides “critical digital infrastructure” for Australia. Though my most important project of all at the moment really is my family, and I do really prioritise my friends and being healthy nowadays. I’m an avid hackerspace person and do have a couple of purportedly active projects (I’m obsessed with maps among other things) but these are relatively neglected at the moment as I just don’t have the bandwidth.

Which Django libraries are your favorite (core or 3rd party)?

I just love the ORM. We’re so spoiled in the Django community we don’t realise how mature and feature-rich the ORM is. Maybe I’m biased because I’ve been using it for so long I just “think” in Django ORM and I’ve been working away from it lately. It’s such a (comparative) pleasure to use. You can nit-pick at it but compared to anything else it’s so beautifully thought through.

The admin was the Django “killer app” in 2008 and I’d argue still is in 2025. To be some dozens of seconds away from a custom CMS backend at any time is still magical. Pony magical. It’s still as impressive as ever to show off to people. Also in the same way that Guido says python makes a great calculator: Django makes a great quick tool for really fast data munging, can’t describe how liberating it feels using it for this purpose.

Writing tests in Django is under-rated too.

There are so many amazing 3rd party libraries, too many to mention. For shout-outs I don’t think I have any projects without Debug Toolbar. The 3rd party caching libraries Memcache and Redis are both great. I’m also usually happy when I turn on Celery, and excited to see DEP-0014 on its way. Danny and Audrey’s Django Cookiecutter project is a great reference even if you don’t take the whole enchilada.

What are the top three things in Django that you like?

I’ve been lucky to generally have had a pretty great time with Django. Generally I’ve used it for projects where it was a really good fit and so it wasn’t painful. As such I like weird little quirky things about Django. Haters-can-hate but I actually really like a bunch of this controversial stuff, for example I like settings.py as a pattern for projects that aren’t out of control; I enjoy using and customising the management commands framework; I think Meta class as an approach to that type of awkward problem is neat; I’ve generally had a pretty nice time with the template language; I dig into utils and reuse them probably more often than most; ORM and the Tests obviously (it’s trivial to plugin pytest of course). Everything is a trade-off in software engineering and while I’m very biased: I just like the trade-offs that Django has chosen, they’re some of the best-in-class.

The top 3 things though? This is tough. I just like it. To nail down actual answers though:

  • the framework workflow overall;
  • that the project has stayed so consistently high quality and battle-hardened for so many years;
  • and the community and my friends (shout out sp-wg)

I know you have start Django with one of the first version, what do you think of the evolution of the framework?

This is a great question! Thanks for being interested in this history, the Django history is a nice story of having good values and persisting and this actually being successful over the long run.

For me there’s all the “back in my day” stuff that’s not obvious now, like Python not being taken seriously as a “real” programming language, let alone javascript, but now those tides have very much turned, and web development is considered extremely respectable and high profile, which was unimaginable when I started. Django started in Web1.0 (whatever that meant), and actually grew substantially during Web2.0 and now even in the modern Web3 era is kind of establishing itself into being part of the backbone of the large parts of the internet that aren’t obvious. Thibaud has a list he maintains of websites that he believes use Django, this is great if you haven’t seen it.

One of the most impressive parts of the evolution has been how decisions have been made and implemented. In normal “work” you just have to make things as fast as possible and endlessly add features consequences-be-damned. Open source gets to be fundamentally the opposite. Traditionally one of the defining characteristics of Open Source is that “time is no object”. That is good design and implementation can be allowed the time to breathe and be excessively thought through. There is no rush or deadline. While there’s always conflict and drama I think there has been less so in Django than in most other projects as design decisions have been painstakingly threshed out and perfected in mailing lists, tickets, DEPs and forums over the months and years it takes to make them. The people inside see the drama but we’re in the news almost never compared to most projects in the same space. The point is that hypothetically it’s possible to try to make the best possible design decisions. In practice most projects don’t do this, but I think Django has demonstrated exemplary maturity in trying to pursue this ideal, and is regularly recognised for it.

The original founding team deserve full credit for instilling this culture and each successive group of stewards deserve credit for preserving it.

There have (and always will be) missteps. For example CBVs are such an obviously good idea on paper, but in practice people don’t think so. On the other hand Andrew Godwin’s implementation of migrations back in the day, that was completely re-writing South from scratch, was truly lovely, even though it was a battle to get to the point of having migrations at all. There’s the history around the db module, which pretty much everyone was too scared to touch after Malcolm died until there were some impressive breakthroughs in it during the “under the hood” sessions not long after DjangoGirls people started coming on board.

Django consciously has decided to be extremely considered in its adoption of change and this has been a great thing. Other frameworks have generally been more cavalier, while Django has been steady, careful and reliable. The other full-feature frameworks are kind of in decline, or have hurt themselves by too-much-change-too-fast, while Django has steadily slowly grown and is the trusty go-to tool for a certain kind of job.

Now moving forward I see focus on the very subtle things that make the framework nicer to use and understand, On just making the core capabilities better and more reliable and performant, and only very very carefully adding features.

In an age where so much quality degradation is occurring, it inspires hope that projects like Django can persist as beacons of high quality, held together by a small group and big community of thoughtful, caring individuals. Hopefully this is something we can continue for a long time into the future also!

You are part of the Code of Conduct working group, how is it to work with the working group? Do you have space available for new members? What does it require according to you?

Code of Conduct WGs are slightly niche and exposed to a certain kind of work and responsibility. Not to mention that respecting many sensitives and view-points is necessary. It also means having the guts to tell people “that’s not how it’s done here” when it needs to be said. Personally it’s a kind of work I’ve grown to be passionate about. I truly believe having a great culture is at the core of community (and really anything good) and can be a complex balancing act of competing factors and emotions. It’s certainly not the kind of thing everyone is into, but if you are, the WG is looking for more diversity, if nothing else it’s tending slightly older at the moment.

Having said that: Within all of the open source communities from local to international levels there’s always space for people who are willing to turn up and help!

Join your local community! Find the parts of community that “speak” to you. Maybe it’s starting a meetup, helping your local conference, running a DjangoGirls. Maybe it’s something engineer-related like finally adding something to an open source library that you’re into, adding some beginner docs somewhere, or engaging with Djangonaut Space. Maybe it’s something online like helping out in forum.djangoproject.com, Reddit or Discord.

As organisers we have this cheat code for finding new people to invite to help more, it’s called “looking for chair-stackers”, that is people who engage to help in the little ways, such as helping stack chairs at the end of an event or generally pack down, wipe up, carry boxes or put things away. Or online: people who go out of their way to try to understand and chip in to manage extra rules, or answer the unanswered thing that’s been sitting there for a while. Or people who just ask “can I help out with that?” when the organisers seem tired or stressed out. Having people around who help in these ways has huge value and has been the beginning of many people being involved in communities and making life-long friends and connections.

Now more than ever though, it’s so important to connect to your community. We are stronger, better and healthier when we are connected to and relied on by other people and we have others we can share our experiences with.

Particularly us computer people tend not to be as good with connecting with other people, but everyone should find their way to get out and connect! It’s sometimes hard but it’s always better.

You have organized many DjangoGirls in Australia, how did you start? Do you have any advice for someone who would like to organize a DjangoGirls event?

In 2014 I was living in Perth, Australia, where Russell Keith Magee is based and we had a budding Python/Django User Group. At one of the meetings news emerged about how Ola and Ola were running this thing called “DjangoGirls” at EuroPython in a few weeks. PyConAU was scheduled a couple of weeks after this. I was like, that’s a great idea, I can absolutely have a go at doing that and emailed them immediately asking if I could copy their materials and plan. We pulled it together with an amazing bunch of people and I think this was technically the 2nd DjangoGirls event ever. In the following years I’ve been involved in many more, including the first North American DjangoGirls. From our Perth series of events a successful organisation was spun off called SheCodes.

In the more-than-a-decade since then the world has changed so much! Particularly in the tech world. I would say specifically for DjangoGirls events, they are very region specific. My first advice for organising an event in your region is to see if there’s been one previously and reach out to the event organisers, or at least the nearest organisers – I think these days there are few places on earth that haven’t had a DjangoGirls event nearish-by. The resources on the website are actually great for getting going and the international DjangoGirls team are lovely, but also always looking for more help.

Where I live now, back in the capital, Canberra, we are very well supported for education services. We held a DjangoGirls event a couple of years ago, but for the attendees what emerged was that what we really wanted was just to connect with other technical women.

Now what has been very successful for us is an ongoing PyLadies/Women’s Software group who meet up regularly and talk about things that matter to our experience. We use the “lean-coffee” model and it’s been unexpectedly functional. This has been one of the best groups I’ve ever been in with a range of technical women regularly sharing our weird and statistically unusual experiences together, it feeds the soul, and is strongly recommended if you don’t participate in a group like this already.

Is there anything else you’d like to say?

A final shout out to the original leaders of the Django community, for me personally Russell, Jeff, Jacob, Andrew and Baptiste in particular, but everyone who has persisted over the years in just turning up over the long haul and keeping our part of the world as beautiful as can be. My friends Dave, Matt and Jonah. Thibaud is a great president right now. Rarely is there a dedicated Django person who is not absolutely delightful and I feel both proud and honoured to be part of this community. A big thank you to everyone (especially you Sarah! And all the Sarahs, Natalias, Lillys and Olas) who help to make Django what it is.

Thank you for doing the interview, Elena !

https://www.djangoproject.com/weblog/2025/jun/17/dsf-member-of-the-month-elena-williams/

#django #python #webdev

Elena in DjangoGirls Brisbane
Django news (unofficial)djangonews@socialhome.network
2025-06-10

Django bugfix releases issued: 5.2.3, 5.1.11, and 4.2.23

Following the June 4, 2025 security release, the Django team is issuing releases for Django 5.2.3, Django 5.1.11, and Django 4.2.23 to complete mitigation for CVE-2025-48432: Potential log injection via unescaped request path (full description).

These follow-up releases migrate remaining response logging paths to a safer logging implementation, ensuring that all untrusted input is properly escaped before being written to logs. This update does not introduce a new CVE but strengthens the original fix.

We encourage all users of Django to upgrade as soon as possible.

Affected supported versions

  • Django main
  • Django 5.2
  • Django 5.1
  • Django 4.2

Resolution

Patches to resolve the issue have been applied to Django's main, 5.2, 5.1, and 4.2 branches. The patches may be obtained from the following changesets.

CVE-2025-48432: Potential log injection via unescaped request path

The following releases have been issued

The PGP key ID used for this release is : 3955B19851EA96EF

https://www.djangoproject.com/weblog/2025/jun/10/bugfix-releases/

#django #python #webdev

Django news (unofficial)djangonews@socialhome.network
2025-06-09

DSF calls for applicants for a Django Fellow

The Django Software Foundation is announcing a call for Django Fellow applications. A Django Fellow is a contractor, paid by the Django Software Foundation, who dedicates time to maintain the Django framework.

The Fellowship program was started in 2014 as a way to dedicate high-quality and consistent resources to the maintenance of Django. The Django Software Foundation currently supports two Fellows –Natalia Bidart and Sarah Boyce– and has approved funding for a new full-time Fellow. This position will be initially for a period of one year, but may be extended depending on fundraising levels.

Beyond keeping Django running, a fellow is a representative of Django itself. They embody the welcoming culture of Django and aid the community to progress the framework. Fellows are often called upon to speak at Django conferences and events.

They are also usually leading Django Sprints occurring in conferences or other setups. Hence a Django Fellow often engages in both informal and formal mentorship.

Responsibilities

Fellow duties include (but are not limited to):

  • Monitoring security reports and ensuring security issues are acknowledged and responded to promptly
  • Fixing release blockers and helping to backport fixes to these and security issues
  • Ensure timely releases including being a release manager for a new version of Django
  • Triaging tickets on Trac
  • Reviewing and merging pull requests
  • Answering contributor questions on the Forum
  • Helping new Django contributors land patches and learn our philosophy

Requirements

A Django fellow reviews a very large amount of Django contributions. This requires knowledge in every aspect of web development that the Django framework touches. This turns out to be an intimidatingly-large list of technical topics, many of which are listed below. It’s not our expectation that you come into the job knowing everything on this list! We hope you’ll have solid experience in a few of these topics, particularly some of the “core” technologies important to Django (Python, relational databases, HTTP). But we fully expect that you’ll learn most of this on the job. A willingness to learn, and a demonstrated history of doing so, is more important than comprehensive knowledge.

The technical topics you can expect to work on includes (and is not limited to):

  • SQL and Databases: SQLite, MySQL, Postgres, Oracle
  • Technical Documentation
  • Javascript
  • CSS
  • Semantic HTML
  • Accessibility
  • UI/UX design (Web and CLI)
  • Python async
  • Python features (and versions), compatibility matrix, etc.
  • Everything around HTTP
  • Security best practices

There are also:

  • Complex processes which need adhering to
  • Multiple discussions which need opinions and direction
  • Requirements for both formal and informal mentorship

And required professional skills such as:

  • Conflict resolution
  • Time management and prioritization expertise
  • Ability to focus in short periods of time and do substantial context switches
  • Self-awareness to recognize their own limits and reach out for help
  • Relationship-building and coordination with Django teams, working groups, and potentially external parties.
  • Tenacity, patience, compassion and empathy are essential

Therefore a Django Fellow requires the skills and knowledge of a senior generalist engineer with extensive experience in Python and Django. Open source experience, especially in contributing to Django, is a big plus.

Being a Django contributor isn't a prerequisite for this position — we can help get you up to speed. We'll consider applications from anyone with a proven history of working with either the Django community or another similar open-source community. While no geographical location is required, we have a slight preference for timezones between around -8 and +3 UTC to allow for better working hours to overlap the current fellows.

If you're interested in applying for the position, please email us at fellowship-committee@djangoproject.com describing why you would be a good fit along with details of your relevant experience and community involvement. Lastly, please include at least one recommendation.

The current hourly rate for a fellow is $82.26 USD.

Applicants will be evaluated based on the following criteria:

  • Details of Django and/or other open-source contributions
  • Details of community support in general
  • Understanding of the position
  • Clarity, formality, and precision of communications
  • Strength of recommendation(s)

Applications will be open until midnight AoE, 1 July, 2025, with the expectation that the successful candidate will start around August 1, 2025.

https://www.djangoproject.com/weblog/2025/jun/09/django-fellow-applicants-2025/

#django #python #webdev

Django news (unofficial)djangonews@socialhome.network
2025-06-04

Django security releases issued: 5.2.2, 5.1.10, and 4.2.22

In accordance with our security release policy, the Django team is issuing releases for Django 5.2.2, Django 5.1.10, and Django 4.2.22. These releases address the security issues detailed below. We encourage all users of Django to upgrade as soon as possible.

CVE-2025-48432: Potential log injection via unescaped request path

Internal HTTP response logging used <tt class="docutils literal">request.path</tt> directly, allowing control characters (e.g. newlines or ANSI escape sequences) to be written unescaped into logs. This could enable log injection or forgery, letting attackers manipulate log appearance or structure, especially in logs processed by external systems or viewed in terminals.

Although this does not directly impact Django's security model, it poses risks when logs are consumed or interpreted by other tools. To fix this, the internal <tt class="docutils literal">django.utils.log.log_response()</tt> function now escapes all positional formatting arguments using a safe encoding.

Thanks to Seokchan Yoon (https://ch4n3.kr/) for the report.

This issue has severity "moderate" according to the Django security policy.

Affected supported versions

  • Django main
  • Django 5.2
  • Django 5.1
  • Django 4.2

Resolution

Patches to resolve the issue have been applied to Django's main, 5.2, 5.1, and 4.2 branches. The patches may be obtained from the following changesets.

CVE-2025-48432: Potential log injection via unescaped request path

The following releases have been issued

The PGP key ID used for this release is Natalia Bidart: 2EE82A8D9470983E

General notes regarding security reporting

As always, we ask that potential security issues be reported via private email to <tt class="docutils literal">security@djangoproject.com</tt>, and not via Django's Trac instance, nor via the Django Forum. Please see our security policies for further information.

https://www.djangoproject.com/weblog/2025/jun/04/security-releases/

#django #python #webdev

Django news (unofficial)djangonews@socialhome.network
2025-05-22

Why, in 2025, do we still need a 3rd party app to write a REST API with Django?

<link rel="canonical" href="https://emma.has-a.blog/articles/why-do-we-need-an-external-app-for-rest.html">

The question was asked to the president of the DSF this year at FOSDEM, after his talk. And it is clearly a legitimate one!

But… is it True? Do we actually need a 3rd party app to write an API with Django?

In a lot of cases, when you require a complex and full-featured API, I would recommend you do use one. Django REST Framework and Django Ninja being very sound choices with a bunch of nifty things you might need in a bigger project.

But… what if what you need is a simple REST API that does CRUD? Do you really need a 3rd party app to do that?

Let's try not to!

Let's first ask what is a REST API in the context of this article. Let's limit ourselves to building this:

  • a URL that answers to GET requests with a list of records of a single model type
  • POST-ing to that same URL should create a new record
  • a second URL with the primary key of a record tagged to the end. When GET-ing that URL, one should receive only that single record, in a similar format as in the list
  • PUT-ing data to that URL should update the record and return that record with updated values
  • DELETE-ing to that same URL should delete the record
  • everything should be achieved using JSON

Listing records from a model

Chances are you have heard of generic class-based views (CBVs) in Django, the one that comes to mind when it comes to listing records is the built-in django.views.generic.ListView.

ListView extends 2 other classes, BaseListView and MultipleObjectTemplateResponseMixin. Since we want to build an API, we clearly don't need to extend anything template-related. Looking at what BaseListView provides, one can notice the only thing really missing there is a render_to_response method. And this is going to be the case for most of the other base classes.

This sets our starting point!

The type of response we want to render is a json response and Django already provides one. So let's build a JsonViewMixin that looks like this for now:

class JsonViewMixin(View):
response_class = JsonResponse
content_type = 'application/json'

<span class="k">def</span><span class="w"> </span><span class="nf">render_to_response</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">,</span> <span class="o">**</span><span class="n">response_kwargs</span><span class="p">):</span>
    <span class="n">response_kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">"content_type"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">content_type</span><span class="p">)</span>
    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">response_class</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="o">**</span><span class="n">response_kwargs</span><span class="p">)</span>

The next thing we have to tackle is that the context returned by BaseListView's get_context_data returns much more data than what we strictly need for this article. Also the list of records returned is not serialized to json.

Serializers for mutliple formats already exist in Django core (see django.core.serializers) but I will go a different route here. There is another way to serialize data in Django that you are likely familiar with but is not labelled as clearly: forms.

Forms are used in regular views to serialize models to simple types, understandable by HTML forms (mostly text) and vice-versa. This is very close to what we need, since json is also mostly text-based.

To start with, using forms as serializers requires creating a new form instance for each record in the list we want to return.

Let's add that to the mixin!

def serialize_many(self, obj_list):
return [self.serialize_one(obj) for obj in obj_list]

def serialize_one(self, obj) form = self.get_form_for_object(obj) serialized = form.initial serialized['pk'] = obj.pk # forms strip pk's from their data return serialized

def get_form_for_object(self, obj): form_class = self.get_form_class() kwargs = self.get_form_kwargs() kwargs['instance'] = obj return form_class(**kwargs)

Why use forms?

ModelForms are a built-in and robust Django tool that are built around the idea of handling the transition between Model fields and simple (and also JSON-serializable) types (mostly text and numbers). Which is exactly what we want from (de-)serializers in a lot of cases.

If you need to (de-)serialize a custom field type, Django documents creating a custom form field and this covered in various places like StackOverflow.

Moving on to our first View

Now that we have a tool to serialize the records list returned by BaseListView let's write the first version of JsonListView. As I alluded to earlier, we need to strip down what is returned from get_context_data.

class JsonListView(JsonViewMixin, BaseListView):

<span class="k">def</span><span class="w"> </span><span class="nf">get_context_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
    <span class="n">context</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_context_data</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
    <span class="c1"># wrapping this in a dict for security reasons</span>
    <span class="k">return</span> <span class="p">{</span>
        <span class="s1">'results'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">serialize_many</span><span class="p">(</span><span class="n">context</span><span class="p">[</span><span class="s1">'object_list'</span><span class="p">])</span>
    <span class="p">}</span>

This won't work yet because get_form_class that I used in the JsonViewMixin is only provided by classes that descend from FormMixin. Since we want this view to handle both listing and creating records, let's go and fix that in the next section!

1 down, 3 to go: Adding records

First thing first, let's rebrand JsonListView and make it inherit from BaseCreateView.

class JsonListCreateView(JsonViewMixin, BaseCreateView, BaseListView):

Form creation and validation will be handled automatically by Django!

Almost…

The first concern will be with populating the form with POST data. While Django does this for you when dealing with URL encoded or multipart form data, it does not (yet) handle json-encoded POST content.

But this can be handled by taking advantage of the modularity of Django's generic class-based-views and overwritting get_form_kwargs.

Let's address this (in a naïve way) within the mixin as it will be applicable to any JSON view:

def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
if (
len(kwargs.get("data", {})) == 0
and self.request.content_type == "application/json"
and len(self.request.body)
):
# The request has a JSON body that we did not decode
kwargs["data"] = json.loads(self.request.body)

<span class="k">return</span> <span class="n">kwargs</span>

An issue that could arise here is that a JSONDecoderError could be triggered. get_form_kwargs does not return a response so I don't think it is the right place to handle the exception.

The post method does return a response, let's wrap the original one with a try/except (still in the mixin):

def post(self, request, args, **kwargs):
try:
return super().post(request, args, **kwargs)
except json.decoder.JSONDecodeError as e:
return self.response_class(
{"error": f"json decode error: {e.msg}"},
status=HTTPStatus.UNSUPPORTED_MEDIA_TYPE,
)

Speaking of returning responses, the BaseCreateView class is built around HTML principles and its form_valid and get methods are both designed to render a form (via get_context_data).

In the case of our REST API, the "create" part of things should not be involved with GET requests.

Furthermore the reply to an invalid form submission should only comprise of an error (status + message) and should not require anything provided by get_context_data.

Still, in regards to form validation, a valid form should not result in a redirect (behaviour of BaseCreateView) but rather in a 201 response optionally containing the representation of the created record.

The form handling part is generic enough to put it in the mixin itself.

The behaviour of GET is specific to the list/create view though.

Let's write the code accordingly:

class JsonViewMixin(View):

...

def form_invalid(self, form): return self.response_class( {'errors': form.errors}, status=HTTPStatus.UNPROCESSABLE_CONTENT )

def form_valid(self, form): self.object = form.save() context = self.serialize_one(self.object) return self.response_class( context, status=HTTPStatus.CREATED )

class JsonListCreateView(JsonViewMixin, BaseCreateView, BaseListView):

...

def get_context_data(self, kwargs): # Explicitly point to BaseListView instead of super() # to prevent actions taken by # BaseCreateView's implementation of get_context_data context = BaseListView.get_context_data(self, kwargs) return { 'results': self.serialize_many(context['object_list']) }

Halfway there!

That was everything needed to handle the create and list portions of our CRUD REST application. Now we can move on to the read, update, delete part. We'll do that in a second View class as it requires a slightly different URL, one that contains the pk of the resource.

Both read and update functionalities are provided by Django BaseUpdateView but, as with the create/list view, the major difference in this case will be that we need a much simpler context.

class JsonReadUpdateView(JsonViewMixin, BaseUpdateView):

<span class="k">def</span><span class="w"> </span><span class="nf">get_context_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">serialize_one</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">object</span><span class="p">)</span>

That's it!!!

Well, almost…

BaseUpdateView is wired to answer to POST requests for updating a record while REST good practices want us to use PUT instead. The fix for this is to raise an error in reply to POST calls while directing PUTs to the parent's post implementation.

def post(self, request, *args, **kwargs):
return self.response_class(status=HTTPStatus.METHOD_NOT_ALLOWED)

def put(self, request, args, **kwargs): return super().post(self, request, args, **kwargs)

One more fix…

Our mixin implementation returns a 201 on form_valid. In case of any view which is not creating a record, this should be 200. Here are the necessary changes:

class JsonViewMixin(View):
form_valid_status = HTTPStatus.OK  # new property

<span class="k">def</span><span class="w"> </span><span class="nf">form_valid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">form</span><span class="p">):</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">object</span> <span class="o">=</span> <span class="n">form</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
    <span class="n">context</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">serialize_one</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">object</span><span class="p">)</span>

<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">response_class</span><span class="p">(</span>
    <span class="n">context</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">form_valid_status</span>  <span class="c1"># use the new property</span>
<span class="p">)</span>

<span class="o">...</span>

class JsonListCreateView(JsonViewMixin, BaseCreateView, BaseListView): form_valid_status = HTTPStatus.CREATED # override in case of creation

Why PUT and not PATCH?

BaseUpdateView builds a form that expects all fields to be filled. Non-present fields would be reset to empty on the existing record for partial updates.

I'll leave it as an exercise to the reader to override that behaviour in case of a PATCH request in order to "pre-fill the form" with existing values, maybe by using the form's initial property… 😉

Finally…

The last bit of logic we have to implement is for deleting objects. Most of the code from Django's BaseDeleteView is related to creating and validating a form for confirming the user's intend on deleting the resource. This is usually not the expected behaviour for a REST API, this part being handled by whatever is calling the API.

Furthermore, it doesn't implement a delete method. In the HTML world of Django's BaseDeleteView, everything is done using GET and POST. So we are (mostly) on our own for this last part.

We can still leverage the get_object implementation provided by BaseUpdateView though.

Here is what implementing the delete operation for our read/update/delete view looks like:

class JsonReadUpdateDeleteView(JsonViewMixin, BaseUpdateView):  # name changed

<span class="o">...</span>

<span class="k">def</span><span class="w"> </span><span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">get_object</span><span class="p">()</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
    <span class="c1"># data is required by JsonResponse</span>
    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">response_class</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="p">{},</span> <span class="n">status</span><span class="o">=</span><span class="n">HTTPStatus</span><span class="o">.</span><span class="n">NO_CONTENT</span><span class="p">)</span>

Conclusion

This implementation is basic and clearly naïve. But it gets the job done!

And this can all be done by leveraging Django-provided tools and mechanisms, mainly using Django's generic CBVs.

Generic class-based views have been built in such a modular fashion that implementing one's own mini REST framework can be done in less than 100 lines of code.

A non-negligible advantage of such an approach is that most libraries written to work with Django's generic CBVs are also likely to work with this implementation.

This rather simple approach can certainly be improved (handling exceptions in delete… anyone?) and is clearly not going to cover everybody's use cases. And it most likely misses handling a bunch of edge cases!

And if you are building a large REST API, I would say you are probably still better off using a 3rd party library but… to me, the answer to the question “Why do you need a 3rd party application to write a simple REST application with Django?” is: "You don’t"

If you enjoyed this article, read more from Emma on Emma has a blog, which is where this piece was from. Or watch the FOSDEM talk that Emma reacts to:

<figure> <figcaption>Thibaud Colas - Shifting DX expectations: keeping Django relevant 😬 | FOSDEM 2025</figcaption> </figure>

https://www.djangoproject.com/weblog/2025/may/22/why-need-3rd-party-app-rest-api-with-django/

#django #python #webdev

Django news (unofficial)djangonews@socialhome.network
2025-05-16

Our Google Summer of Code 2025 contributors

We’re excited to introduce our Google Summer of Code 2025 contributors!

These amazing folks will be working on impactful projects that will shape Django’s future.
Meet the contributors 👇

A. Rafey Khan

Project: Django Admin – Add Keyboard Shortcuts & Command Palette. Mentors: Tom Carrick, Apoorv Garg

Rafey will work on making Django Admin faster and more accessible through keyboard-driven workflows. Excited to see this land!

Farhan Ali Raza

Project: Bring django-template-partials into core. Mentor: Carlton Gibson

Farhan will be enhancing Django’s template system by adding first-class support for partials—making componentized templates easier than ever.</p>

Saurabh K

Project: Automate processes within Django’s contribution workflow. Mentor: Lily Foote

Saurabh will work on streamlining how contributors interact with Django repo—automating repetitive tasks and improving dev experience for all.
A huge shoutout to our mentors (and Org Admin Bhuvnesh Sharma) and the broader Django community for supporting these contributors! 💚

Let’s make this a summer of learning, building, and collaboration.

https://www.djangoproject.com/weblog/2025/may/16/our-google-summer-of-code-2025-contributors/

#django #python #webdev

Django news (unofficial)djangonews@socialhome.network
2025-05-15

Our new accessibility statement

Happy Global Accessibility Awareness Day! We thought this would be a fitting occasion to announce our brand new Django accessibility statement 🎉

Did you know that according to the WebAIM Million survey, 94.6% of sites have easily-detectable accessibility issues? We all need to work together to build a more inclusive web (also check out our diversity statement if you haven’t already!). There are accessibility gaps in Django itself too. This statement improves transparency, and clearly states our intentions. And we hope it encourages our community and the industry at large to more widely consider accessibility.

How to use this statement

Read it, share it with your friends, or in a procurement context!

  • Use it to understand where there are gaps in Django that need to be addressed on projects.
  • And opportunities to contribute to Django and related projects ❤️
  • Factor it into legal compliance. For example with the European Accessibility Act. Starting June 2025, accessibility becomes a legal requirement for large swaths of the private sector in the European Union.
  • Share it with venues for Django events to demonstrate the importance of accessibility for their competitiveness.

How you can help

Take a moment to provide any feedback you might have about the statement on the Django Forum. Let us know if you would prefer additional reporting like an ATAG audit, or VPAT, ACR, or any other acronym. Let us know if you’d like to contribute to the accessibility of the Django community! 🫶

https://www.djangoproject.com/weblog/2025/may/15/our-new-accessibility-statement/

#django #python #webdev

Django news (unofficial)djangonews@socialhome.network
2025-05-15

DjangoCon Europe and beyond

We had a blast at DjangoCon Europe 2025, and hope you did too! Events like this are essential for our community, delighting both first-timers and seasoned Djangonauts with insights, good vibes, and all-around inspiration. This year’s conference brought together brilliant minds from all corners of the globe. And featured early celebrations of Django’s 20th birthday! ⭐️🎂🎉

After launching in 2005, Django turns 20 in 2025, and the conference was a great occasion for our community to celebrate this. And work on the sustainability of the project together.

We need more code reviews

Our Django Fellow Sarah Boyce kicked off the conference with a call for more contributions – of the reviewing kind. In her words,

Django needs your help. Every day, contributors submit pull requests and update existing PRs, but there aren't enough reviewers to keep up. Learn why Django needs more reviewers and how you can help get changes merged into core.

We need more fundraising

Our Vice President Sarah Abderemane got on stage to encourage more financial support of Django from attendees, showcasing how simple it is to donate to the project (get your boss to do it!). We have ambitious plans for 2025, which will require us to grow the Foundation’s budget accordingly.

Annual meeting of DSF Members

Our Board members Tom Carrick, Thibaud Colas, Sarah Abderemane, and Paolo Melchiorre were at the conference to organize a meeting of Members of the Django Software Foundation. This was a good occasion to discuss long-standing topics, and issues of the moment, such as:

  • Diversity, equity and inclusion. Did you know we recently got awarded the CHAOSS DEI bronze badge? We need to keep the momentum in this area.
  • Management of the Membership at the Foundation. With different visions on how much the membership is a recognition or a commitment (or both). There was interest in particular in sharing more calls to action with members.
  • Content of the website. A long-standing area for improvement (which we’re working on!)

All in all this was a good opportunity for further transparency, and to find people who might be interested in contributing to those areas of our work in the future.

Birthday celebrations

There was a cake (well, three!). Candles to blow out. And all-around great vibes and smiles, with people taking pictures and enjoying specially-made Django stickers!

<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/QScxBJQFgPg?si=oYZgaD2sn_wVeZng" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

Up next

We have a lot more events coming up this year where the Foundation will be present, and bringing celebrations of Django’s 20th birthday!

PyCon US 2025

It’s on, now! And we’re present, with a booth. Come say hi! There will be Django stickers available:

PyCon Italia 2025

Some of the PyCon Italia team was there at DjangoCon Europe to hype up their event – and we’ll definitely be there in Bologna! They promised better coffee 👀, and this will have to be independently verified. Check out their Djangonauts at PyCon Italia event.

EuroPython 2025

We got to meet up with some of the EuroPython crew at DjangoCon Europe too, and we’ll definitely be there at the conference too, as one of their EuroPython community partners 💚. There may well be birthday cake there too, get your tickets!

Django events

And if you haven’t already, be sure to check out our next flagship Django events!

Thank you to everyone who joined us at DjangoCon Europe, and thank you to the team behind the conference in particular ❤️. DjangoCon Europe continues to show the strength and warmth of our community, proving that the best part of Django is truly the people. See you at the next one!

https://www.djangoproject.com/weblog/2025/may/14/djangocon-europe-and-beyond/

#django #python #webdev

Django news (unofficial)djangonews@socialhome.network
2025-05-14

DSF member of the month - Simon Charette

For May 2025, we welcome Simon Charette as our DSF member of the month! ⭐

Simon Charette is a longtime Django contributor and community member. He served on the Django 5.x Steering Council and is part of the Security team and the Triage and Review team. He has been a DSF member since November 2014.
You can learn more about Simon by visiting Simon's GitHub Profile.

Let’s spend some time getting to know Simon better!

Can you tell us a little about yourself (hobbies, education, etc)

My name is Simon Charette and I'm based in Montréal. I've been contributing to Django for over a decade mainly to the ORM and I have a background in software engineering and mathematics. I work as a principal backend engineer at Zapier where we use Python and Django to power many of our backend services. Outside of Django and work I like to spend time cycling around the world, traveling with my partner, and playing ultimate frisbee.

Out of curiosity, your GitHub profile picture appears to be a Frisbee, is it correct? If so, have you been playing for a long time?

I've been playing ultimate frisbee since college which is around the time I started contributing to Django. It has been a huge part of my life since then as I made many friends and met my partner playing through the years. My commitment to ultimate frisbee can be reflected in my volume of contributions over the past decade as it requires more of my time during certain periods of the year. It also explains why I wasn't able to attend most DjangoCon in spring and fall as this is usually a pretty busy time for me. I took part in the world championships twice and I played in the UFA for about 5 years before retiring three years ago. Nowadays I still play but at a lower intensity level and I am focused on giving back to the community through coaching.

How did you start using Django?

Back in college I was working part time for a web agency that had an in house PHP framework and was trying to determine which tech stack and framework they should migrate to in order to ease onboarding of their developers and reduce their maintenance costs. I was tasked, with another member of the team, to identify potential candidates and despite my lack of familiarity with Python at the time we ended up choosing Django over PHP's Symphony mainly because of its spectacular documentation and third-party app ecosystem.

What other framework do you know and if there is anything you would like to have in Django if you had magical powers?

If I had magical powers I'd invent Python ergonomics to elegantly address the function coloring problem so it's easier for Django to be adapted to an async-ready world. I'm hopeful that the recent development on the GIL removal in Python 3.13+ will result a renewed interest in the usage of threading, which Django is well equipped to take advantage of, over the systematic usage of an event loop to deal with web serving workloads as the async world comes with a lot of often overlooked drawbacks.

What projects are you working on now?

I have a few Django related projects I'm working on mainly relating to ORM improvements (deprecating extra, better usage of RETURNING when available) but the main one has been a tool to keep track of the SQL generated by the Django test suite over time to more easily identity unintended changes that still pass the test suite. My goal with this project is to have a CI invokable command that would run the full Django test suite and provide a set of tests that generated different SQL compared to the target branch so its much easier to identify unintended side effects when making invasive changes to the ORM.

Which Django libraries are your favorite (core or 3rd party)?

What are the top three things in Django that you like?

  • The people
  • The ORM, unsurprisingly
  • The many entry points the framework provides to allow very powerful third-party apps to be used together

You've contributed significantly to improving the Django ORM. What do you believe is the next big challenge for Django ORM, and how do you envision it evolving in the coming years?

The ORM's expression interface is already very powerful but there are effectively some remaining rough edges. I believe that adding generalized support for composite virtual fields (a field composed of other fields) could solve many problems we currently face with how relationships are expressed between models as we currently lack a way to describe an expression that can return tuples of values internally. If we had this building block, adding a way to express and compose table expressions (CTE, subquery pushdown, aggregation through subqueries) would be much easier to implement without denaturing the ORM by turning it into a low level query builder. Many of these things are possible today (e.g. django-cte) but they require a lot of SQL compilation and ORM knowledge and can hardly be composed together.

How did you start to contribute to the ORM? What would be the advice you have for someone interested to contribute to this field?

I started small by fixing a few issues that I cared about and by taking the time to read through Trac, mailing lists, and git-blame for changes in the area that were breaking tests as attempted to make changes. One thing that greatly helps in onboarding on the ORM is to at least have some good SQL fundamentals. When I first started I already had written a MSSQL ORM in PHP which helped me at least understand the idea behind the generation of SQL from a higher level abstraction. Nowadays there are tons of resources out there to help you get started on understand how things are organized but I would suggest this particular video where I attempt to walk through the different phases of SQL generation.

Is there anything else you’d like to say?

It has been a pleasure to be able to be part of this community for so long and I'd like to personally thank Claude Paroz for initially getting me interested in contributing seriously to the project.

Thank you for doing the interview, Simon !

https://www.djangoproject.com/weblog/2025/may/14/dsf-member-of-the-month-simon-charette/

#django #python #webdev

Django news (unofficial)djangonews@socialhome.network
2025-05-07

Django security releases issued: 5.2.1, 5.1.9 and 4.2.21

In accordance with our security release policy, the Django team is issuing releases for Django 5.2.1, Django 5.1.9 and Django 4.2.21. These releases address the security issues detailed below. We encourage all users of Django to upgrade as soon as possible.

CVE-2025-32873: Denial-of-service possibility in <tt class="docutils literal">strip_tags()</tt>

<tt class="docutils literal">django.utils.html.strip_tags()</tt> would be slow to evaluate certain inputs containing large sequences of incomplete HTML tags. This function is used to implement the <tt class="docutils literal">striptags</tt> template filter, which was thus also vulnerable. <tt class="docutils literal">django.utils.html.strip_tags()</tt> now raises a <tt class="docutils literal">SuspiciousOperation</tt> exception if it encounters an unusually large number of unclosed opening tags.

Thanks to Elias Myllymäki for the report.

This issue has severity "moderate" according to the Django security policy.

Affected supported versions

  • Django main
  • Django 5.2
  • Django 5.1
  • Django 4.2

Resolution

Patches to resolve the issue have been applied to Django's main, 5.2, 5.1, and 4.2 branches. The patches may be obtained from the following changesets.

CVE-2025-32873: Denial-of-service possibility in <tt class="docutils literal">strip_tags()</tt>

The following releases have been issued

The PGP key ID used for this release is Natalia Bidart: 2EE82A8D9470983E

General notes regarding security reporting

As always, we ask that potential security issues be reported via private email to <tt class="docutils literal">security@djangoproject.com</tt>, and not via Django's Trac instance, nor via the Django Forum. Please see our security policies for further information.

https://www.djangoproject.com/weblog/2025/may/07/security-releases/

#django #python #webdev

Client Info

Server: https://mastodon.social
Version: 2025.07
Repository: https://github.com/cyevgeniy/lmst