1

jQueryタブをクリックしてアクティブなタブを保存するたびにセッションの値を更新する次のRESTメソッドがあります。

@csrf_exempt
def update_active_tab_request(request):
    """
    Stores the active tab for a given tab item
    """
    for tab, active in request.GET.iteritems():
        request.session[tab] = int(active)

    return HttpResponse("OK", status=200)

これはかなり単純なルーチンであり、私が抱えている問題は、値が常にセッションに格納されるとは限らないということです。Webサーバーのログを表示し、ログステートメントを散在させて、コードが呼び出されていることを確認しました。すべてが機能しているように見えますが、このメソッドが戻ったときにセッションが更新されていない可能性があることがわかりました。

セッションの更新に伴うパフォーマンス/同期の問題である可能性があると考えて、セッションストレージをに変更しましSESSION_ENGINE='django.contrib.sessions.backends.cache'た。それは役に立ちませんでした。SESSION_SAVE_EVERY_REQUEST=Trueまた、常にセッションを保存するように設定しました。これも役に立たなかった。

私はこの振る舞いを説明するのに途方に暮れています。問題に光を当てるのに助けがあれば大歓迎です。

4

1 に答える 1

0

これを修正することはできませんでしたが、回避策を発見しました。Djangoの低レベルキャッシュAPIを使用して、アクティブなタブを手動でキャッシュに保存します。

from django.core.cache import cache


def save_viewer_tab(active, session_key, tab):
    cache.set(session_key + ":" + str(tab), int(active))


def get_viewer_tab(session_key, tab, default=0):
    return cache.get(session_key + ":" + str(tab), default)


@csrf_exempt
def update_active_tab_request(request):
    """
    Stores the active tab for a given tab item
    """
    session_key = request.session._session_key
    for tab, active in request.GET.iteritems():
        save_viewer_tab(active, session_key, tab)

    return HttpResponse("OK", status=200)

確実に機能しますが、セッションでタブの値を格納した以前のコードが信頼できない理由はまだわかりません。

これは、適切な解決策が見つかるまでのストップギャップ測定です。

于 2013-03-12T10:08:55.660 に答える