Skip to main content
Python and Django development

Python and Django development from a team that has shipped it for years

Django is our primary framework and has been for most of the company history. It is not a fashionable choice and that is precisely why we made it. Django brings the security defaults, the administration interface, the database migrations and the permission model that every business system needs, so budget goes into your logic rather than into foundations.

Why we build business systems on Django

Every web framework can produce a working application. The differences show up later, in how much of the boring but essential work you have to build yourself, how safe the defaults are when a developer is tired, and how much it costs to upgrade three years from now. Django wins on all three for the kind of software we are usually asked to build.

It arrives with sensible protection against the common web attacks already switched on. It has a proper migration system, so changing the database as requirements evolve is a controlled operation rather than a series of hand written statements that somebody forgets to run on the live server. It has a user and permission model that suits almost every business application. It has an administration interface that gives clients a usable back office within days rather than weeks.

Just as importantly, Django has been maintained for many years by a large community with a published release and support policy. That matters commercially. An application written today has a documented upgrade path for a long time, and there are thousands of developers who could maintain it if you ever needed somebody other than us. Fashionable frameworks frequently cannot offer either of those things.

Django REST Framework for interfaces

When an application needs to feed a mobile app, a partner system or a separate front end, we use Django REST Framework. It handles serialisation, authentication, permissions, filtering, pagination and throttling in ways that other developers recognise immediately, and it gives us browsable documentation that makes integration work far less painful for whoever is on the other side.

Our own platform uses this pattern extensively. One Django backend defines the business rules once, and the web interface, the Android application and the iOS application all consume the same API. That is why the three stay consistent instead of slowly drifting apart, which is a common and expensive failure in projects where each platform reimplements the logic.

Celery and Redis for everything that should not block

Any application that grows will eventually need to do something slow. Sending thousands of notifications. Producing a large report. Processing an uploaded file. Calling an external service that takes eight seconds on a bad day. Doing that work while a user waits is the fastest way to make software feel broken.

We use Celery with Redis to move that work into background processes. The user clicks a button and gets an immediate response, while the heavy lifting happens where nobody is watching. The same infrastructure runs scheduled tasks, such as nightly summaries, reminder messages, overdue alerts and data housekeeping. Redis also serves as the cache, which is usually the single fastest improvement available to a sluggish application.

MySQL and the data underneath

Django works comfortably with MySQL, which is our usual choice for durable storage. We design schemas properly, using constraints and foreign keys rather than trusting the application layer to behave, and we choose indexes based on the queries the system will genuinely run rather than adding them everywhere and hoping.

The part that separates experienced Django work from inexperienced Django work is usually query behaviour. It is very easy to write code that looks clean and quietly issues one database query per row in a list, which is fine with twenty records and catastrophic with twenty thousand. We watch for those patterns during development rather than discovering them when a client calls to say the page has stopped loading.

What Django projects we take on

We build new Django applications from scratch, we extend existing ones, and we take over projects where the previous developer has moved on. Rescue work is common enough that we have a standard approach to it, starting with a written assessment of the code, the database and the server so you know exactly what condition your system is in before deciding what to do.

We also handle Django upgrades, which many companies postpone until their version is unsupported and the jump becomes frightening. Handled as a series of small planned steps, an upgrade is routine. Left for five years, it becomes a project in its own right, and the security exposure in the meantime is real.

Django services we provide

  • New Django application development
  • Django REST Framework API design
  • Taking over existing Django projects
  • Django and Python version upgrades
  • Database design and query optimization
  • Celery and Redis background processing
  • Deployment with NGINX and Gunicorn
  • Security review and hardening
  • Long term maintenance and support

Stack

PythonDjangoDRF MySQLRedisCelery GunicornNGINXDocker
Proof

Django at real scale, running right now

The clearest evidence of what we can do with this stack is a platform we built and still operate ourselves.

QuranRecord is a complete school management platform serving schools, madrasas, mosques, private teachers and families across many countries. It handles more than a million page views a month and exists on the web, on Android and on iOS. The backend is Django, the interfaces are Django REST Framework, the storage is MySQL, the cache is Redis, the background work runs on Celery and the whole thing sits on Linux servers behind NGINX and Gunicorn.

It is a useful reference for prospective clients because it is not a demonstration. It carries years of accumulated records, thousands of daily interactions, notification traffic across many time zones and two mobile applications consuming the same API. Every performance lesson we apply to client work was learned there first.

See the platform
1M+
Monthly page views
3
Clients on one API
24/7
Background workers running
18
Years of Python experience

Python and Django questions

For business systems with accounts, permissions, workflow and reporting, Django provides more of what you need out of the box and requires far less assembly. JavaScript frameworks are excellent for highly interactive interfaces, and we use JavaScript where an interface genuinely needs it, but choosing one as the foundation for a records based business system usually means building for months what Django already includes.

Yes, and we do it regularly. We start with a written assessment covering code quality, database design, dependency versions, security posture and server configuration. You get an honest picture of what is sound, what is risky and what it would cost to stabilise, before committing to anything further.

It is a risk rather than a disaster. Unsupported versions stop receiving security fixes, which matters increasingly over time. Upgrades are best done as a series of planned steps with testing between each, and we can carry that out while the system stays in service. Postponing it only makes the eventual jump larger.

Where it earns its complexity. On larger systems and where several environments must match, containers and scripted deployment are genuinely valuable. On a small application they can add more moving parts than they remove, so we choose per project rather than applying one pattern everywhere.

Comfortably, when it is built correctly. Our own platform serves over a million page views a month on ordinary infrastructure. What limits applications in practice is almost never the framework, it is inefficient queries, missing caching and synchronous work that should have been moved into background tasks.

Need Django developers who will still be here next year?

Whether you are starting something new, rescuing an existing project or planning an upgrade, tell us where you are and we will tell you what we would do.