django-buforowane-pole jest aplikacja Django, który zapewnia Seler odroczonego, buforowane pola w Django ORM dla drogiego-do-oblicz danych
Korzystanie Django ORM i seler, utrzymać drogie do oblicz atrybuty up-to-date.
Przykład
Powiedzmy, że masz wolną metodę na jednym z modeli:
Klasa Latarni (models.Model):
& Nbsp;property
& Nbsp; def slow_full_name (self):
& Nbsp; snu (30)
& Nbsp; return '% s% s% s "% (self.weight, self.first_name, self.country)
Fuj; zbyt wolno. Miejmy w pamięci podręcznej, że. Będziemy chcieli kilka narzędzi. Seler
z django_cached_field importu CachedIntegerField, ModelWithCachedFields
Klasa Latarni (models.Model, ModelWithCachedFields):
& Nbsp; slow_full_name = CachedTextField (null = True)
& Nbsp; def calculate_slow_full_name (self):
& Nbsp; snu (30)
& Nbsp; return '% s% s% s "% (self.weight, self.first_name, self.country)
(Tak, calculate_ jest tylko konwencja. I wyraźnie nie podano ducha szyn ...)
Następnie przeprowadzić migrację schematu db zawierać nowe pole pamięci podręcznej za pomocą południe lub rolki własne. Należy zauważyć, że dwa pola zostaną dodane do tej tabeli, cached_slow_full_name typu tekstu i slow_full_name_recalculation_needed typu logicznego, prawdopodobnie zalegających na true.
Już, że jest trochę lepiej. lamppost.slow_full_name może zająć 30 sekund po raz pierwszy, że jest wywoływana dla danego rekordu, ale od tego czasu, to będzie prawie natychmiastowy. Oczywiście, w tym momencie, to nigdy się nie zmieni po tej pierwszej rozmowy.
Pozostałe ważne elementem układanki jest, aby unieważnić naszą pamięć. Thoses pola składowe są chyba zmieniło w jakiś views.py (może to być mądrzejszy o zauważając, jeśli odpowiednie wartości są uaktualniane):
render_to ("latarni / edit.html")
edytuj def (wniosek, lamppost_id):
& Nbsp; latarni = Lamppost.objects.get (pk = lamppost_id)
& Nbsp; request.METHOD == 'POST':
& Nbsp; forma = LamppostForm (request.POST)
& Nbsp; form.is_valid ():
& Nbsp; form.save ()
& Nbsp; form.instance.flag_slow_full_name_as_stale ()
& Nbsp; indziej:
& Nbsp; forma = LamppostForm ()
& Nbsp; return {'form': formularz "latarni": latarni}
To jest najtrudniejsza część jak dewelopera! Buforowanie wymaga dopaść każdego miejsca wartość może być zmieniona, a wywołanie tej metody flag_slow_full_name_as_stale. Czy kraj przypisany losowy nową wartość każdego ranka na cron'o'clock? To była najlepsza być flaga czerstwy przez cron'o'one. Nie można obliczyć masę ciała w oparciu o sumę wszystkich związanych gołębi? Hak do lądowania gołębi. I start. I wszystko, co zmienia wagę indywidualnego gołębia. Jak powiedział Abraham Lincoln: "Są tylko dwa trudne problemy w programowaniu:. Nazewnictwa, cache unieważnianie i błędy off-by-one"
instalacji
Możesz dokonać rzeczy proste na siebie:
pip zainstalować django-buforowane-field
Lub, w przypadku instalacji ręcznej, można sklonować repo i zainstalować go przy użyciu Pythona i setup.py:
git clone git: //github.com/aquameta/django-cached-field.git
cd Django-buforowane pola /
python setup.py install
Testowane z django 1.3.1, seler 2.3.1, Django selera 2.3.3.
Konfiguracja
Dwa ustawienia zmiany są dość dużo rzeczy wymagane do pracy: upewnij się, że jest to zarejestrowany aplikacji, upewnij się, seler widzi swój plik zadania:
INSTALLED_APPS + = ['django_cached_field "]
CELERY_IMPORTS + = ['django_cached_field.tasks ",]
Jedną ze zmian jest opcjonalne: czy powinno się zdarzyć, gdy ponowne przeliczenie oznaczony jako nieświeży (domyślnie) lub pozostawić do następnego czasu atrybut jest dostęp. Jest to przydatne w środowiskach testowych, gdzie nie obchodzi, że twoje wartości w pamięci podręcznej są nieważne. Należy pamiętać, że w tej sytuacji, że nie będzie musiał seler.
CACHED_FIELD_EAGER_RECALCULATION = True lub False w # środowiskach testowych
To jest opcja globalna, więc poszczególne wyjątki powinny być raczej traktowane przez przepuszczenie and_recalculate argument wywołania flag_FIELD_as_stale.
Ostrzeżenia
- Stan Wyścig jeśli flaga pole jako przestarzałe w transakcji db, że zajmuje więcej czasu niż praca seler ma być nazwana.
- Wszystkie metody ORM (np order_by, filtry) trzeba użyć cached_FIELD.
- Recalculate_FIELD wykorzystuje .update (cached_FIELD = aby ustawić wartość.
- Flag_FIELD_as_stale wykorzystuje .update, oraz
Wymagania :
- Python .
- Django
Komentarze nie znaleziono