Ich habe ein 'Kern' Django-Produkt, das Standardimplementierungen von allgemeinen Aufgaben enthält, aber ich möchte zulassen, dass diese Implementierung neu definiert wird (oder angepasst wird, wenn dies einfacher ist).Wie kann ich eine Funktion in Django neu definieren lassen?
Zum Beispiel in dem Kernprodukt, könnte ich einen Blick habe, die ein Benutzer auf eine Schaltfläche klicken kann erneut zu senden ‚um alle Benachrichtigungen‘:
# in core/views.py
... imports etc...
from core.tasks import resend_notifications
def handle_user_resend_request(request, user_id):
user = get_object_or_404(id=user_id)
if request.method == 'POST':
for follower in user.followers:
resend_notifications(follower.id)
... etc etc ...
# in core/tasks.py
... imports etc...
def resend_notifications(id):
send_email(User.objects.get(id=id))
Und dann in einigen Installationen dieses Produkts, "vielleicht die resend_notifications Bedürfnisse wie folgt aussehen:
# in customer_specific/tasks.py
... imports etc ...
def resend_notifications(id):
person = User.objects.get(id=id)
if '@super-hack.email.com' in person.email:
# This is not a real email, send via the magic portal
send_via_magic(person)
else:
send_email(person)
# and send via fax for good measure
send_fax(person)
Wie kann ich die resend_notifications
Funktion in der views.py
Datei auf die customer_specific Version Punkt bekommen?
Sollte ich dies in der Django-Konfiguration definieren und den Zugriff auf diese Weise freigeben? Was, wenn die Aufgaben eigentlich Sellerieaufgaben sind?
NB: Die Aufgaben, die ich habe, sind eigentlich definiert als Sellerie-Aufgaben (Ich entfernte dieses zusätzliche Detail, weil ich denke, die Frage ist allgemeiner). Ich habe versucht mit einem benutzerdefinierten Decorator-Tag, das ein globales Objekt mutiert, aber das ist definitiv nicht der Weg aus einer Reihe von Gründen.
PS: Ich glaube, das ist eine Frage der Abhängigkeitsinjektion, aber das ist in Django nicht üblich.
Ich kann definitiv sehen, dass dies eine gute Wahl ist. In meinem Fall muss ich jedoch in der Lage sein, diesen agnostischen Zugang sowohl innerhalb des Kern- als auch des "benutzerdefinierten" Moduls zu haben. Ich kann mir keinen Weg vorstellen, wie dies in den "Kern" integriert werden könnte, ohne dass der Kern explizites Wissen über das benutzerdefinierte Modul erfordert. d. h. ich muss die Funktion 'def forms(): ...' in 'core/tasks.py' setzen, aber dann kann nichts von' customer_specific' importiert werden. – Doddie
Hmm, ich habe deine Antwort noch ein paar Mal gelesen. Ich denke, Sie könnten Recht haben, aber die 'def forms(): ..' Stil-Funktion muss Einstellungen/App-Konfiguration von einer Art verwenden. – Doddie
Sie suchen im Wesentlichen nach dem Abstraktionsmuster auf Python-Modulebene - und die pragmatischste Art und Weise, wie ich selbst dazu gekommen bin, war ein Modul zu schreiben, mit dem ich generisch interagiere, das zwei andere Module (zumindest konzeptionell) enthält) kompatible Schnittstellen. – Steve