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.

Published 17.12.2009