私は一般的なタスクのデフォルトの実装を含む 'core' Django製品を持っていますが、その実装を再定義できるようにしたいのですが、カスタマイズするとカスタマイズが容易になります。おそらく '、この製品のいくつかの展開でDjangoで関数を再定義する方法を教えてください。
# 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))
その後:中核製品で例えば
、私は、ユーザーが「すべての通知」を再送信するボタンをクリックすることを可能にするビューを持っているかもしれません以下のように見えるようにresend_notificationsニーズ:
# 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)
にはどうすればcustomer_specificバージョンを指すようにviews.py
ファイルにresend_notifications
機能を得るのですか?
これをDjangoの設定で定義し、その方法で共有するべきでしょうか?タスクが実際にセロリのタスクの場合はどうなりますか?
NB:私が持っているタスクは実際にはセロリのタスクとして定義されています。私は、グローバルオブジェクトを変更するカスタムデコレータタグを試しましたが、それは間違いなくいくつかの理由のために行く方法ではありません。
PS:これは依存性注入の質問ですが、これはDjangoではよくあることではありません。
これは良い選択であることは間違いありません。しかし、私の場合は、「コア」モジュールと「カスタム」モジュールの両方から、この無関係なアクセスを持つことができる必要があります。カスタムモジュールの明示的な知識を必要とするコアがなくても、これが 'コア'に含まれる方法を考えることはできません。つまり、 'def forms():...'関数を 'core/tasks.py'に入れる必要がありますが、' customer_specific'から何もインポートできません。 – Doddie
うーん、私はあなたの答えをもう数回読んだ。私はあなたが正しいかもしれないと思うが、 'def forms():'スタイル関数はある種の設定/ app configを使う必要がある。 – Doddie
あなたは本質的にPythonモジュールレベルで抽象パターンを使用しようとしています。私がこれまでにやった最も実用的な方法は、一般的に対話するモジュールを書くことでした。 )互換性のあるインターフェース。 – Steve