django-cached-field

Software screenshot:
django-cached-field
Dettagli del software:
Versione: 1.2.2
Data di caricamento: 14 Apr 15
Sviluppatore: Martin Chase
Licenza: Libero
Popolarità: 2

Rating: 1.0/5 (Total Votes: 1)

django-memorizzati nella cache-campo è un app Django che fornisce Sedano-differita, campi cache su Django ORM per i dati costose da calcolare
Utilizzando Django ORM e sedano, mantenere costose da calcolare attributi up-to-date.
Esempio
Diciamo che avete un metodo lento su uno dei vostri modelli:
Classe Lampione (models.Model):
& Nbsp;property
& Nbsp; def slow_full_name (self):
& Nbsp; sleep (30)
& Nbsp; ritorno '% s% s di% s'% (self.weight, self.first_name, self.country)
Ugh; troppo lento. Facciamo cache che. Ci vorrà un paio di strumenti. Sedano con django-sedano dovrà essere istituito e canticchiare insieme senza intoppi. Poi aggiungeremo nel nostro campo cache, ereditiamo dal modello mixin e rinominiamo il nostro metodo appropriato:
da django_cached_field CachedIntegerField import, ModelWithCachedFields
Classe Lampione (models.Model, ModelWithCachedFields):
& Nbsp; slow_full_name = CachedTextField (null = True)
& Nbsp; def calculate_slow_full_name (self):
& Nbsp; sleep (30)
& Nbsp; ritorno '% s% s di% s'% (self.weight, self.first_name, self.country)
(Sì, calculate_ è solo una convenzione. Io chiaramente non hanno dato l'anima rotaie ...)
Prossimo, la migrazione dello schema db per includere il nuovo campo nella cache utilizzando sud, o rotolare il proprio. Si noti che due campi verranno aggiunti a questa tabella, cached_slow_full_name di tipo testo e slow_full_name_recalculation_needed di tipo booleano, probabilmente inadempiente su true.
Già questo è un pò meglio. lamppost.slow_full_name potrebbe richiedere 30 secondi la prima volta che viene chiamato per un dato record, ma da allora in poi, sarà immediato vicino. Naturalmente, a questo punto, non potrà mai cambiare dopo la prima chiamata.
L'importante pezzo del puzzle che rimane è di invalidare la nostra cache. Thoses campi costituenti sono probabilmente cambiate in qualche views.py (questo potrebbe essere più intelligente su accorgersi se si aggiornano i valori rilevanti):
render_to ("lampione / edit.html")
def modifica (richiesta, lamppost_id):
& Nbsp; lampione = Lamppost.objects.get (pk = lamppost_id)
& Nbsp; se 'POST' request.method ==:
& Nbsp; form = LamppostForm (request.POST)
& Nbsp; se form.is_valid ():
& Nbsp; form.save ()
& Nbsp; form.instance.flag_slow_full_name_as_stale ()
& Nbsp; il resto:
& Nbsp; form = LamppostForm ()
& Nbsp; ritorno {'forma': forma, 'lampione': lampione}
Questa è la parte più difficile, come lo sviluppatore! Caching richiede si caccia giù ogni luogo il valore potrebbe essere cambiato e chiamando quel metodo flag_slow_full_name_as_stale. È stato assegnato un valore casuale nuovo ogni mattina alle cron'o'clock? Quella bandiera era meglio essere viziata da cron'o'one. Si calcola il peso in base alla somma di tutti i piccioni associati? Agganciare in atterraggio piccioni. E decollo. E tutto ciò che cambia il peso di un singolo piccione. Come ha detto Abraham Lincoln, "Ci sono solo due problemi difficili in programmazione:. Naming, invalidazione della cache e gli errori off-by-one"
Installazione
È possibile rendere le cose facili su te stesso:
Pip installare django-cache-campo
Oppure, per un'installazione manuale, è possibile clonare il repo e installarlo con python e setup.py:
git clone git: //github.com/aquameta/django-cached-field.git
cd django-memorizzati nella cache-field /
python setup.py install
Testato con Django 1.3.1, 2.3.1 sedano, django-sedano 2.3.3.
Configurazione
Due modifiche delle impostazioni sono praticamente necessari per le cose al lavoro: fare in modo che sia un app registrato, assicurarsi sedano vede il suo file di compiti:
INSTALLED_APPS + = ['django_cached_field',]
CELERY_IMPORTS + = ['django_cached_field.tasks',]
Un cambiamento è facoltativo: se ricalcolo dovrebbe accadere quando contrassegnati come stantio (default) o essere lasciati alla prossima volta l'attributo si accede. Questo è utile per ambienti di test in cui non si cura che i valori memorizzati nella cache non sono validi. Si noti che in questa situazione, non si avrebbe bisogno di sedano.
CACHED_FIELD_EAGER_RECALCULATION = True # o False per ambienti di test
Questa è una opzione globale, così le singole eccezioni dovrebbero invece essere gestite passando l'argomento and_recalculate alla chiamata flag_FIELD_as_stale.
Avvertenze
- Condizione di gara se si contrassegna un campo come stantio in una transazione db che richiede più tempo per completare il lavoro di sedano serve per essere chiamato.
- Tutti i metodi ORM (es order_by, filtro) devono usare cached_FIELD.
- Recalculate_FIELD utilizza .Update (cached_FIELD = per impostare il valore.
- Flag_FIELD_as_stale usa .Update, così

Requisiti :

  • Python
  • .
  • Django

Commenti a django-cached-field

I commenti non trovato
Aggiungi commento
Accendere le immagini!