Kun tietty määrä aikaa kenenkään paneutuvat Django puitteet tulee kysyä: Rakastan Django signaaleja, todellakin. Mutta jos vain voisin lähettää ne asynkronisesti. Kuten, joissakin muissa lanka tai jotain, en todellakaan tiedä .... Onko se jotenkin mahdollista?
No, nyt voit helposti tehdä, että Django-signalqueue.
Watch, minä näytän sinulle. Asenna ensin Django-signalqueue:
$ Pip asentaa Django-signalqueue # tämä asentaa tornado ja Django-edustaja tarvittaessa
... Haluat ehkä myös joitakin näistä valinnaisia paketteja, jos sinulla ei ole niitä jo:
$ Hautua asentaa redis yajl # s / hautua / apt-get / maun
$ PIP asentaa redis hiredis # suositeltava
$ Pip install ujson # suositeltava
$ Pip asentaa czjson yajl simplejson # näiden työtä liian
$ PIP asentaa nenä Django-nenä # testeistä
Lisää Django-signalqueue teidän INSTALLED_APPS ja asetukset jono, kun olet oman settings.py:
# Settings.py
INSTALLED_APPS = [
& Nbsp; "signalqueue", # ...
]
SQ_QUEUES = {
& Nbsp; "default": {# tarvitset ainakin yhden dict nimeltään 'default' in SQ_QUEUES
& Nbsp; NAME: "signalqueue_default ', # valinnainen - oletusarvo" signalqueue_default "
& Nbsp; "moottorin" signalqueue.worker.backends.RedisSetQueue ', # tarvita - tämä on jono kuljettaja
& Nbsp; "VAIHTOVÄLI": 30, # 1/3 sec
& Nbsp; "Asetukset": dict (),
& Nbsp;}
}
SQ_RUNMODE = 'SQ_ASYNC_REQUEST' # käyttö async lähettämistä oletuksena
SQ_WORKER_PORT = 11231 # portti jono työprosessi sitoutuvat
Tämän kaiken lisäksi, sinun tarvitsee vain soittaa signalqueue.autodiscover () in your root URLConf:
# Urls.py
tuonti signalqueue
signalqueue.autodiscover ()
Voit määrittää async signaaleja!
Asynchronous signaalit ovat esimerkkejä signalqueue.dispatch.AsyncSignal että olet määritellyt jokin seuraavista paikoista:
- Your_app / signals.py (se on hieno, jos olet jo käyttävät tätä tiedostoa, koska monet tekevät)
- Moduulit nimetään settings.SQ_ADDITIONAL_SIGNALS luetteloon tai monikossa
- Tulossa: signalqueue.register () - joten voit laittaa ne missään muualla.
AsyncSignals määritellään paljon kuin tuttuja tapauksia django.dispatch.Signal tiedät ja rakkautta:
# Yourapp / signals.py
alkaen signalqueue.dispatch tuonti AsyncSignal
alkaen signalqueue.mappings tuoda ModelInstanceMap
# Nämä kaksi rakentajille tehdä sama asia
my_signal = AsyncSignal (providing_args = ['esimerkiksi']) # Yuge
my_other_signal = AsyncSignal (providing_args = {'esimerkiksi': ModelInstanceMap}) # kanssa kartoituksia
# Mitä seuraa voi mennä minne tahansa - vain tapauksissa tarvitse olla yourapp / signals.py:
def soittopyynnön (lähettäjä, ** kwargs):
& Nbsp; print "Minä,% s, on täten lähetetään asynkronisesti% s, kiitos django-signalqueue." % (
& Nbsp; str (kwargs ['esimerkiksi']),
& Nbsp; lähettäjä .__ name__)
my_signal.connect (soittopyyntö)
... Suurin ero on toinen määritelmä, joka määrittää providing_args kuin dict kartoitusta luokkien sijasta tavallinen lista. Me selittää kartoitus luokissa myöhemmin, mutta jos olet ohimennen Django malli tapauksissa sinun signaaleja, sinun ei tarvitse huolehtia tästä.
Kun työntekijä on käynnissä, voit lähettää signaalin jono kuten niin:
>>> My_signal.send (lähettäjän = AModelClass, esimerkiksi = a_model_instance)
Tuleen signaalin kuin normaali Django signaali, voit tehdä tämän:
>>> My_signal.send_now (lähettäjän = AModelClass, esimerkiksi = a_model_instance)
Viritä huomenna hämmästyttävä tekemisestä ... Django-signalqueue README !!!!!!
Vaatimukset :
- Python
- Django
Kommentteja ei löytynyt