Pagkatapos ng ilang panahon ang sinuman tungkol sa kanilang mga sarili sa Django balangkas ay pagpunta sa hilingin ang tanong: mahal ko signal Django, ang katunayan. Ngunit ko kung lang ma-dispatch ang mga ito asynchronously. Tulad ng, sa ilang ibang mga thread o isang bagay, hindi ko talaga alam .... Iyan ba kahit papaano ay posible?
Well, ngayon maaari mong madaling gawin na may Django-signalqueue.
Manood, kukunin ko na ipakita sa iyo. Una, i-install Django-signalqueue:
$ Buto ng bungang-kahoy-install Django-signalqueue # na ito ay i-install buhawi at Django-delegado kung kinakailangan
... Maaari mo ring ilan sa mga opsyonal na mga pakete, kung wala kang mga ito na:
$ Gumawa ng serbesa i-install redis yajl # s / magluto / apt-get / sa panlasa
$ Buto ng bungang-kahoy-install redis hiredis # Inirerekumenda
$ PIP install ujson # inirerekomenda
$ PIP masyadong i-install czjson yajl simplejson # mga trabaho
$ Buto ng bungang-kahoy-install ilong Django-ilong # para sa mga pagsusulit
Magdagdag ng Django-signalqueue sa iyong INSTALLED_APPS, at ang mga setting para sa isang pila, habang ikaw ay nasa iyong settings.py:
# Settings.py
INSTALLED_APPS = [
& Nbsp; 'signalqueue', # ...
]
SQ_QUEUES = {
& Nbsp; 'default': {# kailangan mo ng hindi bababa sa isang dict na may pangalang 'default' sa SQ_QUEUES
& Nbsp; 'NAME': 'signalqueue_default', # opsyonal - ang mga default upang 'signalqueue_default'
& Nbsp; 'engine': 'signalqueue.worker.backends.RedisSetQueue', # kinakailangan - ito ay ang driver ng iyong queue ng
& Nbsp; 'INTERVAL': 30, # 03/01 sec
& Nbsp; 'Mga Pagpipilian': dict (),
& Nbsp;},
}
SQ_RUNMODE = 'SQ_ASYNC_REQUEST' # paggamit async dispatch sa pamamagitan ng default
SQ_WORKER_PORT = 11231 # sa port sa iyong proseso ng pag-manggagawa queue ay sumailalim sa
Bukod sa lahat ng mga iyon, kailangan mo lamang ng isang tawag sa signalqueue.autodiscover () sa iyong root URLConf:
# Urls.py
-import signalqueue
signalqueue.autodiscover ()
Maaari mong tukuyin ang mga signal ng async!
Asynchronous signal ang mga kaso ng signalqueue.dispatch.AsyncSignal na iyong tinukoy sa isa sa mga sumusunod na lugar:
- Your_app / signals.py (ito ay pinong kung ginamit mo ang file na ito, bilang marami ang)
- Mga module pinangalanan sa isang listahan o tuple settings.SQ_ADDITIONAL_SIGNALS
- Malapit na: signalqueue.register () - kaya maaaring ilagay ang mga ito kahit saan pa.
AsyncSignals ay tinukoy tulad ng sa pamilyar na mga kaso ng django.dispatch.Signal alam at gusto mo:
# Yourapp / signals.py
mula sa pag-import signalqueue.dispatch AsyncSignal
mula signalqueue.mappings-import ModelInstanceMap
# Ang dalawang constructor gawin ang parehong bagay
my_signal = AsyncSignal (providing_args = ['halimbawa']) # ang yuge
my_other_signal = AsyncSignal (providing_args = {'halimbawa': ModelInstanceMap}) # may mga mapping
# Ano mga sumusunod ay maaaring pumunta sa kahit saan - lamang ang mga pagkakataon na kailangan upang maging sa yourapp / signals.py:
def callback (nagpadala, ** kwargs):
& Nbsp; print "ko,% s, ay sa pamamagitan nito despatsado asynchronously sa pamamagitan ng% s, salamat sa Django-signalqueue." % (
& Nbsp; STR (kwargs ['halimbawa']),
& Nbsp; nagpadala .__ name__)
my_signal.connect (callback)
... Ang pangunahing pagkakaiba ay ang pangalawang kahulugan, na tumutukoy providing_args bilang isang dict sa mga klase ng pagma-map sa halip na isang simpleng listahan. Ipapaliwanag namin kung klase ng pagma-map sa ibang pagkakataon, ngunit kung ikaw ay pagpasa sa paglitaw ng modelo Django sa iyong mga signal, hindi mo kailangang mag-alala tungkol dito.
Kapag ang manggagawa ay tumatakbo, maaari mong ipadala ang signal sa linya tulad nito:
>>> My_signal.send (nagpadala = AModelClass, halimbawa = a_model_instance)
Upang sunog ng iyong signal tulad ng isang normal na Django signal, maaari mong gawin ito:
>>> My_signal.send_now (nagpadala = AModelClass, halimbawa = a_model_instance)
Tune sa bukas para sa mga kahanga-hanga pagtatapos ng ... ang Django-signalqueue Readme !!!!!!
Mga Kinakailangan :
- Python
- Django
Mga Komento hindi natagpuan