Po pewnym nikogo czasowe dotyczące się z ramy Django zamierza zadać pytanie: Kocham sygnały Django, rzeczywiście. Ale jeśli tylko mogę wysyłać je asynchronicznie. Jak, na innym wątku, czy coś, ja naprawdę nie wiem .... Czy to jakoś możliwe?
Cóż, teraz można łatwo zrobić z django-signalqueue.
Zobacz, pokażę ci. Najpierw należy zainstalować Django signalqueue:
$ Pip zainstalować django-signalqueue # to zainstaluje tornado, aw razie potrzeby django-delegatem
... Możesz również chcą niektóre z tych opcjonalnych pakietów, jeśli nie ma ich już:
$ Napar zainstalować Redis yajl # s / zaparzania / apt-get / do smaku
$ Pip install Redis hiredis # polecany
$ Pip install ujson # polecane
$ Pip install czjson yajl simplejson # te prace za
$ Pip zainstalować django-nos nos # do testów
Dodaj Django signalqueue do INSTALLED_APPS, i ustawieniach kolejce, gdy jesteś w settings.py:
# Settings.py
INSTALLED_APPS = [
& Nbsp; "signalqueue", # ...
]
SQ_QUEUES = {
& Nbsp; "default": {# trzeba co najmniej jeden dict o nazwie "default" w SQ_QUEUES
& Nbsp; "NAZWA": "signalqueue_default", # opcjonalny - domyślnie 'signalqueue_default "
& Nbsp; "silnik": "signalqueue.worker.backends.RedisSetQueue", # wymagane - to jest sterownik kolejki
& Nbsp; "CZASU": 30, # 1/3 s
& Nbsp; "Opcje": DICT (),
& Nbsp;},
}
SQ_RUNMODE = '' # Zastosowanie SQ_ASYNC_REQUEST wysyłki domyślnie asynch
SQ_WORKER_PORT = 11231 # port Twój proces roboczy zwiąże się kolejki
Poza tym wszystkim, wystarczy zadzwonić do signalqueue.autodiscover () w URLconf root:
# Urls.py
Import signalqueue
signalqueue.autodiscover ()
Można zdefiniować sygnały async!
Sygnały asynchroniczne są przypadki signalqueue.dispatch.AsyncSignal które zostały zdefiniowane w jednym z następujących miejsc:
- Your_app / signals.py (jest w porządku, jeśli już się do tego pliku, jak wiele zrobić)
- Moduły wymienione w wykazie settings.SQ_ADDITIONAL_SIGNALS lub krotki
- Wkrótce: signalqueue.register () - tak można umieścić je w innym miejscu.
AsyncSignals są zdefiniowane podobnie jak znane przypadki django.dispatch.Signal znasz i miłości:
# Yourapp / signals.py
z signalqueue.dispatch importu AsyncSignal
z signalqueue.mappings importować ModelInstanceMap
# Ci dwaj konstruktorzy zrobić to samo
my_signal = AsyncSignal (providing_args = ['instance']) # yuge
my_other_signal = AsyncSignal (providing_args = {"wystąpienie": ModelInstanceMap}) # z odwzorowań
# Co za tym idzie można przejść w dowolnym miejscu - jedynie te przypadki muszą być w yourapp / signals.py:
zwrotna def (nadawca, ** kwargs):
& Nbsp; print "I,% s, zostały wysłane asynchronicznie przez niniejszym% s, dzięki django-signalqueue." % (
& Nbsp; str (kwargs ["instancja"]),
& Nbsp; nadawca .__ name__)
my_signal.connect (zwrotna)
... Główną różnicą jest to druga definicja, która określa providing_args jako dict z klas mapowania zamiast zwykłej listy. Wyjaśnimy klas odwzorowań później, ale jeśli jesteś przejazdem modelu wystąpień Django do sygnałów, nie musisz się o to martwić.
Gdy pracownik pracuje, możesz wysłać sygnał do kolejki tak:
>>> My_signal.send (nadawca = AModelClass, wystąpienie = a_model_instance)
Aby ogień sygnał jak normalnego sygnału Django, można to zrobić:
>>> My_signal.send_now (nadawca = AModelClass, wystąpienie = a_model_instance)
Ciotka Julia i skryba za zadziwiającą zawarcia ... README django-signalqueue !!!!!!
Wymagania :
- Python
- Django
Komentarze nie znaleziono