Django-sovellus on suhteellisen helppoa rakentaa siten, että se lataa kaiken tarvittavan välimuistista, eikä tee ollenkaan SQL-tietokantahakuja. Omien datamallien lisäksi on kuitenkin huomioitava muutama Djangon sisäänrakennettu komponentti, jotka yrittävät väkisin tehdä SQL-hakuja. Ne voi eliminoida seuraavasti.
1. Välimuistittava authentication backend
Jos käyttäjä on kirjautunut sisään, Django kutsuu jokaisella hakupyynnöllä authentication backendin get_user()-funktiota. Normaalisti tämä lataa käyttäjän tiedot SQL-tietokannasta. Tietokantahaun voi välttää toteuttamalla oman backendin, joka osaa pitää tiedot välimuistissa esimerkiksi omaa kustomoitua User-mallia käyttäen.
#auth_backends.py
from django.contrib.auth.backends import ModelBackend
from myapp.profile.models import User
class MyBackend(ModelBackend):
def get_user(self, user_id):
try:
return User.objects.get_by_id(user_id) # uses cache
except User.DoesNotExist:
return None
Oma backend otetaan käyttöön asettamalla settings.py:ssä muuttuja AUTHENTICATION_BACKENDS = ('myapp.auth_backends.MyBackend',).
2. Oman User-mallin get_and_delete_messages()
Django tekee jokaisella hakupyynnöllä kirjautuneille käyttäjille vielä toisenkin SQL-haun tarkistaakseen onko auth_messages-taulussa uusia viestejä. Jos viestejä ei kaipaa omassa sovelluksessa, on helpointa toteuttaa omaan User-malliin tyhjä get_and_delete_messages()-metodi:
#models.py
from django.contrib.auth.models import User as DjangoUser
class User(DjangoUser):
def get_and_delete_messages(self):
return []
3. Site.objects.current_site() monkey-patch
Mikäli käyttää Djangon multi-site-ominaisuutta, tarvitsee usein oletussaittia, joka saadaan metodilla Site.objects.current_site(). Django pitää saittia muistissa Pythonin VM:ssä, mutta jos käytössä on useita palvelinprosesseja, kukin niistä joutuu erikseen hakemaan saitin tiedot kannasta. Tämän voi eliminoida pienellä monkey-patchilla, joka tallentaa saitin oikeaan välimuistiin:
from django.contrib.sites.models import Site
from django.conf import settings
from django.core.cache import cache
_original_get_current = Site._default_manager.class.get_current
def _caching_get_current(self):
site = cache.get('Site:' + str(settings.SITE_ID))
if site is None:
site = _original_get_current(self)
cache.set('Site:' + str(settings.SITE_ID), site)
return site
Site._default_manager.class.get_current = _caching_get_current
Näillä muutoksilla Django ei enää tee lainkaan SQL-hakuja, ja koko HTTP-hakupyyntö voidaan palvella suoraan välimuistista.