After years of working with Django, I’d like to share some tools and techniques for optimising Django frameworks performance, and identify bottlenecks holding your Django application hostage.
So, because performance is a hot topic, let’s talk about how to make Django run quicker and better.
- Deploy your app using nginx + uWsgi/gunicorn.
- Use a CDN Provider to server static files. AWS S3 is a valid option to provide static files. Using a CDN in front of your website can help you mitigate a-lot of performance issues. CloudFront might also be a viable solution if you do not fancy Amazon S3.
- Take your time when creating database indexes. Comprehended your most difficult queries and attempt generating indexes for them.
- Install Django Debug Toolbar in order to inspect your DB queries. It’s a request profiler, to be precise. You can look at CPU time, request time, and many other things.
- Use select_related() and preselect_related(). For me, Django’s built-in functionality has been a game-changer. They really aid in the speeding up of your searches. What is the reason for this? Take a look at this tutorial. This is going to blow your head, believe me.
- Make use of caching. You may set a cache manager in Django by default. You can use Redis or Memcached. Returning the same query over and over again if you have a lot of repeated queries is not very performant. It’s pointless to carry out the entire request. Django allows you to cache the response. You can learn how to cache Django website using Redis
- If you are using Django templates, you can use cache over them as well. Here is a good explanaiton
- For non-blocking/async jobs, use any task manager (Celery), for example, if you need to send an email, delegate that task to Celery.
- Varnish is a performance accelerator that can handle thousands of requests per minute. It adds a cache layer to the mix, but at a higher level. It may be installed on top of Nginx and will cache the entire request before sending it to your application server. If you’re unsure whether to use Redis or Varnish for caching, read on. Note that redis caches data at the application level; your application server will execute the entire request, use your cache, and provide a new HTTP response with your data. Varnish receives the request, checks the rules, and then returns the previously cached request, reducing nginx/application server overhead from request processing.
Typically, optimizing a Python or Django software entails making it faster, minimizing memory use, or reducing database load. If you can considerably minimise one issue, you might sometimes expect to see issues in someplace else. Accelerated speed, for example, can consume a lot more memory and have a negative impact on the overall application. As a result, you should always strive for a good balance between the many goals you wish to attain and the approaches you employ. Always keep in mind the trade-offs you’ll have to make, and keep in mind that each improvement must be worthwhile in terms of your time and work, as these are your most significant assets.
You may also check at the Django documentation on performance and optimization, which has a wealth of useful information.