django-cached-field

Software skärmdump:
django-cached-field
Mjukvaruinformation:
Version: 1.2.2
Ladda upp dagen: 14 Apr 15
Utvecklare: Martin Chase
Licens: Gratis
Popularitet: 2

Rating: 1.0/5 (Total Votes: 1)

django-cachad-fältet är en Django app som ger Selleri-uppskjuten, cachade fält på Django ORM för dyrt-till-calculate uppgifter
Använda Django ORM och selleri, håller dyra-till-calculate attribut up-to-date.
Exempel
Säg att du har en långsam metod på en av dina modeller:
klass Lyktstolpe (models.Model):
& Nbsp;property
& Nbsp; def slow_full_name (själv):
& Nbsp; sömn (30)
& Nbsp; return '% s% s av% s'% (self.weight, self.first_name, self.country)
Ugh; för långsam. Låt oss cache det. Vi kommer att vilja några verktyg. Selleri med django-selleri måste inrättas och nynna längs smidigt. Sedan ska vi lägga vår cachade fält, ärver från modellen mixin och döpa vår metod lämpligt:
från django_cached_field import CachedIntegerField, ModelWithCachedFields
klass Lyktstolpe (models.Model, ModelWithCachedFields):
& Nbsp; slow_full_name = CachedTextField (null = sant)
& Nbsp; def calculate_slow_full_name (själv):
& Nbsp; sömn (30)
& Nbsp; return '% s% s av% s'% (self.weight, self.first_name, self.country)
(Ja, calculate_ är bara en konvention. Jag tydligt har inte gett upp rälsen ghost ...)
Nästa, migrera db schema för att inkludera den nya cachade fält med söderut, eller rulla dina egna. Observera att två fält kommer att läggas till denna tabell, cached_slow_full_name av typen text och slow_full_name_recalculation_needed av typen boolean, förmodligen försumliga till true.
Redan det är kinda bättre. lamppost.slow_full_name kan ta 30 sekunder första gången det blir kallad för en given rekord, men från och med då, det ska vara nigh ögonblick. Naturligtvis på denna punkt, det kommer aldrig att förändras efter det första samtalet.
Den återstående viktiga pusselbit är att ogiltigförklara vår cache. Thoses ingående fält är förmodligen förändrats i någon views.py (detta kan vara mer smart om märker om de relevanta värdena uppdateras):
render_to ("lyktstolpe / edit.html")
def redigera (begäran, lamppost_id):
& Nbsp; lyktstolpe = Lamppost.objects.get (pk = lamppost_id)
& Nbsp; om request.METHOD == 'POST ":
& Nbsp; formen = LamppostForm (request.POST)
& Nbsp; om form.is_valid ():
& Nbsp; form.save ()
& Nbsp; form.instance.flag_slow_full_name_as_stale ()
& Nbsp; annars:
& Nbsp; formen = LamppostForm ()
& Nbsp; avkastning {"form": form, "lyktstolpe": lyktstolpe}
Detta är den svåraste biten som utvecklare! Caching kräver att du jaga varje plats värdet kan ändras och ringer det flag_slow_full_name_as_stale metod. Är landet tilldelats ett slump nytt värde varje morgon klockan cron'o'clock? Att flaggan hade bäst vara inaktuella genom cron'o'one. Vill du beräkna vikten baserad på summan av alla tillhörande duvor? Haka i duvor landning. Och start. Och allt som ändrar en enskild duva vikt. Som Abraham Lincoln sa, "Det finns bara två svåra problem i programmering:. Namngivning, cache ogiltig och off-by-ett fel"
Installation
Du kan göra saker lätt på dig själv:
PiP installera django-cachad-fältet
Eller, för en manuell installation kan du klona reporäntan och installera den med python och setup.py:
git clone git: //github.com/aquameta/django-cached-field.git
cd django-cachad-fältet /
Python setup.py installera
Testad med django 1.3.1, selleri 2.3.1, django-selleri 2.3.3.
Konfiguration
Två inställningar förändringar ganska mycket krävs för saker till jobbet: se till att det är ett registrerat app, se till selleri ser sin uppgift fil:
INSTALLED_APPS + = ['django_cached_field',]
CELERY_IMPORTS + = ['django_cached_field.tasks',]
En förändring är valfritt: om omräkning ska ske när flaggas som inaktuella (standard) eller lämnas till nästa gång attributet nås. Detta är användbart för testmiljöer där man inte bryr att dina cachade värden är ogiltiga. Observera att i denna situation, skulle du inte behöva selleri.
CACHED_FIELD_EAGER_RECALCULATION = Sant # eller falskt för testmiljöer
Detta är en global alternativ, så enskilda undantag bör i stället hanteras genom att skicka and_recalculate argument till flag_FIELD_as_stale samtalet.
Förbehåll
- Race tillstånd om du flaggar ett fält som unken i en db transaktion som tar längre tid att slutföra än selleri jobbet tar att kallas.
- Alla ORM metoder (t.ex. order_by, filtrera) behöver använda cached_FIELD.
- Recalculate_FIELD använder .update (cached_FIELD = för att ställa in värdet.
- Flag_FIELD_as_stale använder .update samt

Krav :

  • Python
  • .
  • Django

Kommentarer till django-cached-field

Kommentarer hittades inte
Kommentar
Slå på bilder!