django-cached-field

Skjermbilde programvare:
django-cached-field
Prog.varedetaljer:
Versjon: 1.2.2
Last opp dato: 14 Apr 15
Utvikler: Martin Chase
Lisens: Gratis
Popularitet: 2

Rating: 1.0/5 (Total Votes: 1)

django-bufret-feltet er en Django app som gir Selleri-utsatt, bufrede felt på Django ORM for dyrt å beregne data
Ved hjelp av Django ORM og selleri, holder dyrt å beregne attributter up-to-date.
Eksempel
Si at du har en langsom metode på en av dine modeller:
klasse Lamppost (models.Model):
& Nbsp;property
& Nbsp; def slow_full_name (egen-):
& Nbsp; søvn (30)
& Nbsp; return '% s% s av% s'% (self.weight, self.first_name, self.country)
Ugh; for sakte. La oss cache det. Vi vil ønske noen verktøy. Selleri med django-selleri må settes opp og humming sammen jevnt. Deretter vil vi legge til i vår bufret felt, arver fra modellen -mixinen og endre navn på vår metode hensiktsmessig:
fra django_cached_field import CachedIntegerField, ModelWithCachedFields
klasse Lamppost (models.Model, ModelWithCachedFields):
& Nbsp; slow_full_name = CachedTextField (null = True)
& Nbsp; def calculate_slow_full_name (egen-):
& Nbsp; søvn (30)
& Nbsp; return '% s% s av% s'% (self.weight, self.first_name, self.country)
(Ja, calculate_ er bare en konvensjon. Jeg åpenbart ikke har gitt opp rails spøkelse ...)
Deretter overfører db skjema for å inkludere den nye bufrede feltet ved hjelp sør, eller rulle din egen. Legg merke til at to feltene vil bli lagt til denne tabellen, cached_slow_full_name av type tekst og slow_full_name_recalculation_needed av type boolean, sannsynligvis misligholde til sann.
Allerede som er ganske bedre. lamppost.slow_full_name kan ta 30 sekunder første gang den blir kalt for en gitt rekord, men fra da av, vil det være nær øyeblikk. Naturligvis, ved dette punktet, vil det aldri endres etter det første anropet.
De resterende viktig brikke i puslespillet er å underkjenne vår cache. Thoses konstituerende felt er trolig endret i noen views.py (dette kan være mer smart om å merke hvis de relevante verdiene oppdateres):
render_to ("lyktestolpe / edit.html")
def redigere (forespørsel, lamppost_id):
& Nbsp; lyktestolpe = Lamppost.objects.get (pk = lamppost_id)
& Nbsp; hvis request.METHOD == 'POST':
& Nbsp; skjema = LamppostForm (request.POST)
& Nbsp; hvis form.is_valid ():
& Nbsp; form.save ()
& Nbsp; form.instance.flag_slow_full_name_as_stale ()
& Nbsp; annet:
& Nbsp; skjema = LamppostForm ()
& Nbsp; retur {'skjema': form, 'lyktestolpe': lyktestolpe}
Dette er den vanskeligste delen som utbygger! Caching krever at du jakte ned hvert sted verdien kan endres og ringer som flag_slow_full_name_as_stale metode. Er landet tildelt en tilfeldig ny verdi hver morgen på cron'o'clock? At flagget hadde beste være flau av cron'o'one. Har du beregne vekt basert på summen av alle tilhørende duer? Koble inn den duer landing. Og takeoff. Og alt som forandrer en persons due vekt. Som Abraham Lincoln sa: "Det er bare to vanskelige problemer i programmering:. Navngiving, cache omstøtelse og off-for-én feil"
Installasjon
Du kan gjøre ting enkelt på deg selv:
PIP installere django-bufret-feltet
Eller, for en manuell installasjon, kan du klone repo og installere det ved hjelp av python og setup.py:
git clone git: //github.com/aquameta/django-cached-field.git
cd Django-bufret-feltet /
python setup.py installere
Testet med django 1.3.1, selleri 2.3.1, django-selleri 2.3.3.
Konfigurasjon
To innstillingsendringer er ganske mye som kreves for at ting skal fungere: sørg for at det er et registrert app, sørg selleri ser sin oppgaver fil:
INSTALLED_APPS + = ['django_cached_field',]
CELERY_IMPORTS + = ['django_cached_field.tasks',]
Én endring er valgfritt: om ny beregning skal skje når flagget som bedervet (standard) eller overlates til neste gang attributtet er tilgjengelig. Dette er nyttig for testmiljøer der du ikke bryr deg om at dine bufrede verdier er ugyldig. Merk at i denne situasjonen, ville du ikke trenger selleri.
CACHED_FIELD_EAGER_RECALCULATION = True # eller usant for testmiljøer
Dette er en global alternativ, så enkelte unntak heller bør håndteres ved å sende and_recalculate argument til flag_FIELD_as_stale samtalen.
Advarsler
- Race tilstand hvis du flagger et felt som bedervet i en db transaksjon som tar lengre tid å fullføre enn selleri jobben tar å bli kalt.
- Alle ORM metoder (for eksempel order_by, filtrer) må bruke cached_FIELD.
- Recalculate_FIELD bruker .update (cached_FIELD = for å angi verdien.
- Flag_FIELD_as_stale bruker .update, samt

Krav :

  • Python
  • .
  • Django

Kommentarer til django-cached-field

Kommentarer ikke funnet
Legg til kommentar
Slå på bilder!