Po určitou dobu kdokoli týkající se s rámcem Django se chystá položit otázku: Miluji signály Django je, opravdu. Ale pokud jsem jen mohl vyšle je asynchronně. Stejně jako na nějakém jiném vlákně, nebo tak něco, já opravdu nevím .... Je to nějak možné?
No, teď si můžete snadno udělat s Django-signalqueue.
Watch, ukážu vám. Za prvé, nainstalujte Django-signalqueue:
$ Pip nainstalovat Django-signalqueue # to bude instalovat tornádo a Django, delegát v případě potřeby
... Můžete také chtít některé z těchto volitelných balíčků, pokud nemáte je již:
$ Vařit nainstalovat REDIS yajl # s / vařit / apt-get / chuti
$ Pip nainstalovat REDIS hiredis # doporučují
$ Pip install ujson # doporučeno
$ Pip nainstalovat czjson yajl simplejson # tyto práce příliš
$ Pip nainstalovat nos Django-nos # pro zkoušky
Přidat Django-signalqueue do svého INSTALLED_APPS a nastavení pro fronty, když jste ve vašem settings.py:
# Settings.py
INSTALLED_APPS = [
& Nbsp; "signalqueue", # ...
]
SQ_QUEUES = {
& Nbsp; "default": {# budete potřebovat alespoň jeden dict s názvem "default" v SQ_QUEUES
& Nbsp; "NAME": "signalqueue_default", # volitelný - výchozí "signalqueue_default"
& Nbsp; "MOTOR": "signalqueue.worker.backends.RedisSetQueue", # zapotřebí - to je ovladač fronty se
& Nbsp; "INTERVAL": 30, # 1/3 sec
& Nbsp; "Možnosti": dict (),
& Nbsp;}
}
SQ_RUNMODE = 'SQ_ASYNC_REQUEST "# použití asynchronní odeslání ve výchozím nastavení
SQ_WORKER_PORT = 11231 # přístav váš pracovní proces fronta se bude vázat na
Kromě toho všeho, stačí volání signalqueue.autodiscover () v kořenovém URLConf:
# Urls.py
import signalqueue
signalqueue.autodiscover ()
si můžete definovat asynchronní signály!
Asynchronní signály jsou případy signalqueue.dispatch.AsyncSignal, které jste definovali v jednom z těchto míst:
- Your_app / signals.py (to je v pořádku, pokud jste již tento soubor použít, protože mnozí)
- Moduly uvedeným v seznamu settings.SQ_ADDITIONAL_SIGNALS nebo tice
- Již brzy: signalqueue.register () - takže si můžete dát kdekoliv jinde.
AsyncSignals jsou definovány podobně jako známé případy django.dispatch.Signal, které znáte a lásku:
# Yourapp / signals.py
od signalqueue.dispatch dovozu AsyncSignal
od signalqueue.mappings import ModelInstanceMap
# Tyto dva konstruktéři dělají stejnou věc
my_signal = AsyncSignal (providing_args = ['instance']) # yuge
my_other_signal = AsyncSignal (providing_args = {'instance': ModelInstanceMap}) # s mapováním
# Co následuje, může jít kamkoliv - pouze instance musí být v yourapp / signals.py:
def callback (odesílatel, ** kwargs):
& Nbsp; print "I,% s, které byly tímto odeslány asynchronně% s, díky Django-signalqueue." % (
& Nbsp; str (kwargs ['instance']),
& Nbsp; odesílatel .__ name__)
my_signal.connect (zpětné volání)
... Hlavní rozdíl je druhá definice, který specifikuje providing_args jako dict se mapování tříd namísto prostého seznamu. Budeme vysvětlovat mapování tříd později, ale pokud jsou předávání instance Django modelu na vaše signály, nemusíte se starat o to.
Jakmile pracovník běží, můžete poslat signál do fronty jako tak:
>>> My_signal.send (odesílatel = AModelClass, instance = a_model_instance)
Chcete-li oheň váš signál jako normální signál Django, můžete to udělat:
>>> My_signal.send_now (odesílatel = AModelClass, instance = a_model_instance)
Nalaďte si zítra pro ohromující uzavření ... Django-signalqueue README !!!!!!
Požadavky na :
- Python
- Django
Komentáře nebyl nalezen