Saya baru saja mulai menerapkan pendengar sinyal dalam proyek Django. Sementara saya mengerti apa itu dan bagaimana menggunakannya. Saya mengalami kesulitan mencari tahu di mana saya harus meletakkannya. Dokumentasi dari situs Django mengatakan ini:
Anda dapat meletakkan kode penanganan sinyal dan registrasi di mana saja Anda suka. Namun, Anda harus memastikan bahwa modul yang ada di dalamnya akan diimpor sejak awal sehingga penanganan sinyal terdaftar sebelum sinyal apa pun perlu dikirim. Ini menjadikan models.py aplikasi Anda tempat yang bagus untuk meletakkan pendaftaran penangan sinyal.
Sementara itu saran yang bagus, memiliki kelas atau metode non model di models.py saya hanya menggosok saya dengan cara yang salah.
Jadi, apa praktik / aturan terbaik untuk menyimpan dan mendaftarkan penangan sinyal?
sumber
Foo
yang merupakan bagian darifooapp
. Tetapi penerima sinyal adalah ekstensi dan tidak hidup di aplikasi yang berbeda (misalnyaotherapp
).Ini ditambahkan ke dokumentasi ketika Django 1.7 dirilis:
Praktik terbaik adalah mendefinisikan handler Anda di handlers.py dalam submodule sinyal, misalnya file yang terlihat seperti:
yourapp / signal / handlers.py :
Tempat terbaik untuk mendaftarkan pengendali sinyal Anda adalah di AppConfig aplikasi yang mendefinisikannya, menggunakan metode ready () . Ini akan terlihat seperti ini:
yourapp / apps.py :
Pastikan Anda memuat AppConfig dengan menetapkannya secara langsung di pengaturan Anda. INSTALLED_APPS Anda, atau di dalam
__init__
aplikasi Anda. Lihat lihat dokumentasi ready () untuk informasi lebih lanjut.Catatan: Jika Anda juga memberikan sinyal bagi aplikasi lain untuk didengarkan, letakkan di
__init__
dalam modul sinyal Anda, misalnya file yang terlihat seperti:yourapp / signal / __ init__.py
Aplikasi lain kemudian dapat mendengarkan sinyal Anda dengan mengimpor dan mendaftarkannya, mis
from yourapp.signals import task_generate_pre_save
. Memisahkan sinyal Anda dari handler Anda menjaga semuanya tetap bersih.Instruksi untuk Django 1.6:
Jika Anda masih terjebak pada Django 1.6 atau lebih rendah, maka Anda akan melakukan hal yang sama (tentukan handler Anda di yourapp / signal / handlers.py) tetapi alih-alih menggunakan AppConfig, Anda akan memuat handler melalui __init__.py dari aplikasi Anda, mis. sesuatu seperti:
yourapp / __ init__.py
Ini tidak sebagus menggunakan metode ready () karena sering menyebabkan masalah impor melingkar.
sumber
__init__
sinyal impor tidak berfungsi untuk saya, jadi saya ingin tahu apakah ada tempat lain tempat saya dapat mengimpor sinyal hingga kami siap untuk meningkatkan ke versi django yang lebih baru.from . import handlers
(atau serupa) diyourapp/signals/__init__.py
?yourproject.
di baris terakhir dari blok kode kelas TaskConfig. Saya mendapatkan ini berfungsi dengan struktur ini, jadi pertimbangkan qa ini :)Saya baru saja menemukan ini, dan karena sinyal saya tidak terkait dengan model saya pikir saya akan menambahkan solusi saya.
Saya mencatat berbagai data di sekitar log in / log out, dan perlu terhubung
django.contrib.auth.signals
.Saya telah memasukkan penangan sinyal ke dalam
signals.py
file, dan kemudian mengimpor sinyal dari__init__.py
file modul, karena saya percaya ini dipanggil segera setelah aplikasi dijalankan (pengujian denganprint
pernyataan menunjukkan bahwa itu dipanggil bahkan sebelum file pengaturan dibaca.)dan di signal.py
Saya cukup baru untuk Django (/ python) jadi saya terbuka untuk siapa saja yang mengatakan kepada saya bahwa ini adalah ide yang mengerikan!
sumber
user_logged_in.connect(on_logged_in)
kemungkinan besar akan lewat dalamdispatch_uid
argumen. Lebih lanjut di docs.djangoproject.com/en/dev/topics/signals/… .Saya baru saja membaca artikel ini tentang praktik terbaik ketika datang untuk memetakan proyek / aplikasi Anda, dan itu menunjukkan bahwa semua sinyal operator kustom Anda harus masuk dalam file bernama
signals.py
. Namun, itu tidak sepenuhnya menyelesaikan masalah Anda, karena Anda masih perlu mengimpor ini di suatu tempat, dan semakin awal mereka diimpor semakin baik.Saran model itu bagus. Karena Anda sudah menentukan semua yang ada di
signals.py
file Anda , seharusnya tidak perlu lebih dari satu baris di bagian atas file. Ini mirip dengan caraadmin.py
file diletakkan (dengan definisi kelas di bagian atas dan kode untuk mendaftarkan semua kelas admin kustom di bagian bawah), jika Anda mendefinisikan sinyal Anda kemudian hubungkan mereka di file yang sama.Semoga itu bisa membantu! Pada akhirnya tergantung pada apa yang Anda inginkan.
sumber
signals.py
file, tetapi tidak tahu bagaimana seharusnya dipanggil setelah itu. Dengan mengimpornya dimodels.py
file saya , saya mendapat solusi yang sangat bersih, tanpa "mencemari" file models.py saya. Terima kasih! :)models.py dan signal.py di setiap aplikasi telah menjadi tempat yang disarankan untuk menghubungkan sinyal, namun, mereka bukan solusi terbaik, menurut saya, untuk menjaga agar sinyal dan penangan tetap dikirim. Pengiriman harus menjadi alasan sinyal dan penangan ditemukan di Django.
Saya berjuang untuk waktu yang lama, dan akhirnya kami menemukan solusinya.
buat modul konektor di folder aplikasi
jadi kita punya:
di app / connectors.py, kami mendefinisikan penangan sinyal dan menghubungkannya. Contoh disediakan:
lalu di models.py, kita tambahkan baris berikut di akhir file:
Semuanya dilakukan di sini.
Dengan cara ini, kita bisa menaruh sinyal di dalam signal.py, dan semua penangan di connectors.py Tidak ada kekacauan dalam model dan sinyal.
Semoga ini memberikan solusi lain.
sumber
Saya menyimpannya dalam file terpisah
signals.py
, dalammodels.py
setelah semua model didefinisikan. Saya mengimpornya dan menghubungkan model ke sinyal.signal.py
models.py
Ini memberikan saya pemisahan yang logis, tentu saja tidak ada salahnya menyimpannya dalam models.py , Tetapi lebih mudah dikelola dengan cara ini.
Semoga ini membantu!!
sumber
Pengingat kecil tentang
AppConfig
. Jangan lupa untuk mengatur:sumber