SQL-kyselyiden eliminoiminen Djangosta
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.
0 Comments
You can use Markdown to format your comment:
Separate paragraphs in your text with two newlines