2016-05-25 8 views
0

私が維持するDjangoアプリケーションでは、ユーザーはログインし、フォーラムスタイルでメッセージを交換します。どの時点でも、最後の5分以内にsessionオブジェクトを記録した人をチェックすることで、オンラインにいる人を示します。これを達成するために、Djangoプラグインuser_sessionsを使用して、通常のORMのようなセッションを操作できます。セロリを使用してDjangoアプリケーションのタスクを非同期で実行する

これを実現するために私のコードは、このようです:

class WhoseOnlineView(ListView): 
    model = Session 
    template_name = "whose_online.html" 

    def get_queryset(self): 
     unique_user_sessions = Session.objects.filter(last_activity__gte=(timezone.now()-timedelta(minutes=5))).only('user').distinct('user') 
     users = [session.user for session in unique_user_sessions] 
     users = [user for user in users if user is not None] #sanitizing None values 
     return users 

ウェブサイトのユーザー(と機能)が大幅に成長している、とnewrelicごとに、この特定のビューは、すべての中でほとんどの時間量を消費しています私の意見

私はこの全体のタスクを非同期的に実行する必要があると考えています。私はセカンダリ(メッセージブローカとしてredisを持つ)を稼動し、私のプロダクションサーバのスーパーバイザーの下で走っています。

これは、60秒に1回実行される定期的なタスクです。しかし、そのためには、をDB(またはキャッシュ)に保存する必要があるので、次回オンラインリストが処理されるまでユーザーは保存された結果を見ることができます。

これを達成する方法の例を教えてください。私が苦労している主なものは、次の定期的なタスクが開始される前に、ユーザーに表示される結果を保存(またはキャッシュ)する方法です。

答えて

0

あなたが好きな何かを行うことができます:

例えば、ユーザーログインを把握するためにセロリのタスクを書くことは、まず、

# fooapp.tasks 

@shared_task 
def whoseonline(): 
    unique_user_sessions = Session.objects.filter(last_activity__gte=(timezone.now()-timedelta(minutes=5))).only('user').distinct('user') 
    users = [session.user for session in unique_user_sessions  users = [user for user in users if user is not None] #sanitizing None values 
    # save the users to the cache 
    cache.set('online_users', users, 70) # expiring in 70 seconds 

などです。タスクを一定時間実行するように設定します。 60秒、これを追加:

# settings.py 

CELERYBEAT_SCHEDULE = { 
    'whoseonline': { 
     'task': 'fooapp.tasks.whoseonline', 
     'schedule': timedelta(seconds=60), # execute every 60 seconds 
     'args':(), 
    }, 
} 

あなたの設定に追加します。次に、あなたのビューで、あなただけの

class WhoseOnlineView(ListView): 
    model = Session 
    template_name = "whose_online.html" 

    def get_queryset(self): 
     # take the values from the cache 
     return cache.get('online_users') 

Hereキャッシュの詳細とセロリについてhereの詳細を行う必要があります。

キャッシュ時間の有効期限(サンプルでは70秒)は、セロリのタスク(サンプルでは60秒)に使用する予定の時間より長くする必要があるので、ビューには常に何かがある表示する。

+0

ええ、私が使っているキャッシュバックエンドは 'django.core.cache.backends.locmem.LocMemCache'です。私は、キャッシュを正しく設定または取得できないことを除いて、すべてが期待通りに機能するようです。キャッシュが正しく設定されているかどうかをテストする方法はありますか?私は 'djangoデバッグツールバー'を試しました。それに応じて、キャッシュは呼び出されていません。 –

+0

キャッシュについて私があなたに渡したリンクを見てください。すべてのキャッシュ装置を設定する方法と使用方法 – trinchet

+0

それは私が使っているものです。正確には、この部分は:https://docs.djangoproject.com/en/1.9/topics/cache/#local-memory-cachingそれは非常にナンセンスなセットアップですので、私は私が何かを困惑しています行方不明 –

関連する問題