Efter en viss tid någon rör sig med ramverket Django kommer att ställa frågan: Jag älskar Django signaler, faktiskt. Men om jag bara kunde sända dem asynkront. Liksom, om någon annan tråd eller något, jag vet inte riktigt .... Är det något sätt möjligt?
Tja, nu kan du enkelt göra det med django-signalqueue.
Titta, jag ska visa dig. Börja med att installera django-signalqueue:
$ Pip installera django-signalqueue # detta kommer att installera tornado och django-delegat vid behov
... Du kanske också vill vissa av dessa valfria paket, om du inte har dem redan:
$ Brygd installera redis yajl # s / brew / apt-get / smak
$ PIP installera redis hiredis # rekommenderas
$ Pip install ujson # rekommenderas
$ Pip installera czjson yajl simplejson # dessa fungerar också
$ PIP installera näsan django-nose # för testerna
Lägg django-signalqueue till din INSTALLED_APPS och inställningarna för en kö, när du är i ditt settings.py:
# Settings.py
INSTALLED_APPS = [
& Nbsp; 'signalqueue ", # ...
]
SQ_QUEUES = {
& Nbsp; 'default': {# du behöver minst en dict som heter "default" i SQ_QUEUES
& Nbsp; 'NAMN': 'signalqueue_default ", # tillval - standard" signalqueue_default "
& Nbsp; 'MOTOR': 'signalqueue.worker.backends.RedisSetQueue', # krävs - det här är din kö drivrutin
& Nbsp; 'INTERVALL ": 30, # 1/3 sek
& Nbsp; "Alternativ": dict (),
& Nbsp;},
}
SQ_RUNMODE = 'SQ_ASYNC_REQUEST' # använda async sändning som standard
SQ_WORKER_PORT = 11231 # hamnen din kö arbetsprocess kommer att binda till
Förutom allt detta, behöver du bara ett samtal till signalqueue.autodiscover () i ditt root URLConf:
# Urls.py
import signalqueue
signalqueue.autodiscover ()
Du kan definiera async signaler!
Asynkrona signaler är instanser av signalqueue.dispatch.AsyncSignal som du har definierat i någon av följande platser:
- Your_app / signals.py (det är bra om du redan använder denna fil, som många gör)
- Moduler som namnges i en settings.SQ_ADDITIONAL_SIGNALS lista eller tupel
- Snart: signalqueue.register () - så att du kan sätta dem någon annanstans.
AsyncSignals definieras ungefär som de välkända fall av django.dispatch.Signal du känner och älskar:
# Yourapp / signals.py
från signalqueue.dispatch import AsyncSignal
från signalqueue.mappings importera ModelInstanceMap
# Dessa två konstruktörer gör samma sak
my_signal = AsyncSignal (providing_args = ['instans']) # av Yuge
my_other_signal = AsyncSignal (providing_args = {'instans': ModelInstanceMap}) # med mappningar
# Vad som följer kan gå någonstans - bara de fall som behöver vara i yourapp / signals.py:
def callback (avsändare, ** kwargs):
& Nbsp; print "Jag,% s, har härmed skickas asynkront med% s, tack vare django-signalqueue." % (
& Nbsp; str (kwargs ['instans']),
& Nbsp; avsändaren .__ name__)
my_signal.connect (återuppringning)
... Den största skillnaden är den andra definitionen, som specificerar providing_args som dict med kartläggning klasser i stället för en vanlig lista. Vi ska förklara kartläggning klasser senare, men om du passerar Django modell instanser på dina signaler, behöver du inte oroa dig för detta.
När arbetstagaren är igång, kan du skicka signalen till kön som så:
>>> My_signal.send (avsändare = AModelClass, instans = a_model_instance)
Att brand din signal som en vanlig Django-signal, kan du göra det här:
>>> My_signal.send_now (avsändare = AModelClass, instans = a_model_instance)
Ratta in imorgon för den häpnadsväckande slutsatsen av ... den django-signalqueue README !!!!!!
Krav :
- Python
- Django
Kommentarer hittades inte