15

すべて、django シグナルに問題があります。

私はモデルを持っています ページ読み込みの応答性を向上させるために、同じデータベースを使用して実行している 2 つ目の localhost Web サーバーへの呼び出しを介して、実行する必要があるいくつかの集中的な処理をオフロードしています。呼び出しプロセスはオブジェクトを取得できるが、呼び出されたプロセスは取得できないという動作が見られます。ポート 80 とポート [ポート] の両方が、同じデータベースで実行されている django プロセスを指しています。

models.py で

class A(models.Model):
    stuff...

def trigger_on_post_save( sender, instance, create, raw, **keywords):
    #This line works
    A.objects.get( pk=instance.pk )
    #then we call this
    urlopen( r'http://127.0.0.1:[port]' + 
        reverse(some_view_url, args(instance_pk) ).read()

post_save.connect( trigger_on_post_save, A )

views.py で

def some_view_function( request, a_pk ):
    #This line raises an object_not_found exception
    A.objects.get( pk=a_pk )

さらに、urlopen 呼び出しで例外が発生した後、オブジェクトはデータベースに存在しません。オブジェクトが保存され、データベースに書き込まれた後に post_save が呼び出されたことは私の理解でした。これは間違っていますか?

4

4 に答える 4

13

保存が発生した後、トランザクションがデータベースにコミットされる前に post_save が起動すると思います。デフォルトでは、Django はリクエストが完了した後にのみ変更をデータベースにコミットします。

あなたの問題に対する2つの可能な解決策:

  1. トランザクションを手動で管理し、コミット後にカスタム シグナルを起動します。
  2. リクエストが処理されるまで、2 番目のプロセスを少し待ちます。

正直なところ、セットアップ全体が少し厄介なようです。おそらく、非同期タスクのキューイングについてCeleryを調べる必要があります。

于 2011-12-16T04:53:50.557 に答える
1

django admin から新しいモデルを作成するときに同じ問題が発生しました。ModelAdmin.save_model手動でトランザクションを管理するメソッドをオーバーライドしました。

def save_model(self, request, obj, form, change):
    from django.db import transaction
    with transaction.commit_on_success():
       super(ModelAdmin, self).save_model(request, obj, form, change)

    # write your code here
于 2015-12-28T10:24:08.510 に答える