Μετά από ένα ορισμένο χρονικό διάστημα ο καθένας τον εαυτό τους σχετικά με το πλαίσιο Django πρόκειται να θέσουμε το ερώτημα: Αγαπώ σήματα Django, και μάλιστα. Αλλά εάν μόνο θα μπορούσα να τους αποστείλει ασύγχρονα. Όπως, σε κάποιο άλλο νήμα ή κάτι, εγώ πραγματικά δεν ξέρω .... Είναι ότι κατά κάποιο τρόπο είναι δυνατόν;
Λοιπόν, τώρα μπορείτε εύκολα να το κάνετε αυτό με Django-signalqueue.
Παρακολουθήστε, θα σας δείξω. Πρώτον, την εγκατάσταση Django-signalqueue:
$ Pip εγκατάσταση Django-signalqueue # Αυτό θα εγκαταστήσει ανεμοστρόβιλος και Django ανάδοχο αν είναι απαραίτητο
... Μπορεί επίσης να θέλετε κάποια από αυτά τα προαιρετικά πακέτα, αν δεν τα έχετε ήδη:
$ Ετοιμάζω εγκατάσταση αναπροεξοφλεί yajl # s / ετοιμάζω / apt-get / στην γεύση
$ PIP εγκαταστήσετε αναπροεξοφλεί hiredis # συνιστάται
$ Pip εγκατάσταση ujson # συνιστάται
$ Pip εγκατάσταση czjson yajl simplejson # αυτά λειτουργούν πάρα πολύ
$ PIP εγκατάσταση Django μύτη-μύτη # για τις δοκιμές
Προσθήκη Django-signalqueue να INSTALLED_APPS σας, καθώς και τις ρυθμίσεις για την ουρά, ενώ είστε σε settings.py σας:
# Settings.py
INSTALLED_APPS = [
& Nbsp? "Signalqueue», # ...
]
SQ_QUEUES = {
& Nbsp? "Default": {# θα πρέπει να έχετε τουλάχιστον μια dict που ονομάζεται «default» σε SQ_QUEUES
& Nbsp? «ΟΝΟΜΑ»: «signalqueue_default», # προαιρετική - προεπιλογές για «signalqueue_default»
& Nbsp? «ΚΙΝΗΤΗΡΑΣ»: «signalqueue.worker.backends.RedisSetQueue ', # απαιτείται - αυτό είναι οδηγός ουρά σας
& Nbsp? »ΔΙΑΣΤΗΜΑ»: 30, # 1/3 δευτ
& Nbsp? «ΕΠΙΛΟΓΕΣ»: dict (),
& Nbsp?},
}
SQ_RUNMODE = 'SQ_ASYNC_REQUEST »# χρήση ασύγχρονη αποστολή από προεπιλογή
SQ_WORKER_PORT = 11231 # το λιμάνι διαδικασία εργαζόμενος ουρά σας θα συνδεθεί με
Πέρα από όλα αυτά, το μόνο που χρειάζεται μια κλήση για να signalqueue.autodiscover () στη ρίζα URLConf σας:
# Urls.py
signalqueue εισαγωγής
signalqueue.autodiscover ()
Μπορείτε να ορίσετε τα σήματα ασύγχρονη!
Ασύγχρονα σήματα περιπτώσεις signalqueue.dispatch.AsyncSignal που έχετε ορίσει σε μια από τις ακόλουθες θέσεις:
- Your_app / signals.py (αυτό είναι καλό, αν έχετε ήδη χρησιμοποιούν αυτό το αρχείο, όπως κάνουν πολλοί)
- Ενότητες το όνομα σε μια λίστα ή πλειάδα settings.SQ_ADDITIONAL_SIGNALS
- Προσεχώς: signalqueue.register () - έτσι ώστε να μπορείτε να τα τοποθετήσετε οπουδήποτε αλλού.
Οι AsyncSignals ορίζονται σαν τα γνωστά περιπτώσεις django.dispatch.Signal που γνωρίζετε και αγαπάτε:
# Yourapp / signals.py
από signalqueue.dispatch AsyncSignal εισαγωγής
από signalqueue.mappings εισαγωγή ModelInstanceMap
# Αυτά τα δύο κατασκευαστές κάνουν το ίδιο πράγμα
my_signal = AsyncSignal (providing_args = [«παράδειγμα»]) # ο yuge
my_other_signal = AsyncSignal (providing_args = {«παράδειγμα»: ModelInstanceMap}) # με τις αντιστοιχίσεις
# Αυτό που ακολουθεί μπορεί να πάει οπουδήποτε - μόνο οι περιπτώσεις πρέπει να είναι σε yourapp / signals.py:
def επανάκλησης (αποστολέας, ** kwargs):
& Nbsp? Εκτύπωσης "εγώ,% s, έχουν εδώ αποστέλλονται ασύγχρονα από% s, χάρη στο Django-signalqueue." % (
& Nbsp? Str (kwargs [«παράδειγμα»]),
& Nbsp? Αποστολέα .__ name__)
my_signal.connect (επανάκλησης)
... Η κύρια διαφορά είναι ο δεύτερος ορισμός, ο οποίος διευκρινίζει providing_args ως dict με κατηγορίες χαρτογράφησης αντί του απλού λίστα. Θα εξηγήσουμε τάξεις χαρτογράφηση αργότερα, αλλά αν περνάτε Django περιπτώσεις το μοντέλο με τα σήματα σας, δεν έχετε να ανησυχείτε για αυτό.
Μόλις ο εργαζόμενος βρίσκεται σε λειτουργία, μπορείτε να στείλετε το μήνυμα στην ουρά όπως έτσι:
>>> My_signal.send (αποστολέας = AModelClass, παράδειγμα = a_model_instance)
Για την πυρκαγιά το σήμα σας όπως ένα κανονικό σήμα Django, μπορείτε να το κάνετε αυτό:
>>> My_signal.send_now (αποστολέας = AModelClass, παράδειγμα = a_model_instance)
Συντονιστείτε αύριο για το εκπληκτικό συμπέρασμα του ... του Django-signalqueue README !!!!!!
Απαιτήσεις :
- Python
- Django
Τα σχόλια δεν βρέθηκε