0

ユーザーがログアウトした後、Django は最後にアクティブ化されたタイムゾーンを覚えているようです。

  1. ユーザー投稿フォーム - UTC として解釈されるフォームの日時
  2. ユーザーは、オーストラリア/シドニーの優先タイムゾーンでログインします
  3. ユーザー投稿フォーム - オーストラリア/シドニーとして解釈されるフォームの日時
  4. ユーザーがログアウトする
  5. ユーザー投稿フォーム - TIME_ZONE が UTC に設定されていても、フォームの日時がオーストラリア シドニーとして解釈される
  6. サーバーを再起動し、ユーザー (まだログインしていない) がフォームを投稿する - UTC として解釈されるフォームの日時

私は持っている

TIME_ZONE = 'UTC'
USE_TZ = True

そしてミドルウェアとして:

class TimezoneMiddleware(object):
    def process_request(self, request):

        tz = request.session.get('django_timezone', '')
        if tz:
            timezone.activate(tz)
        elif request.user.is_authenticated():
            preferredTimezone = request.user.get_profile().preferredTimezone
            timezone.activate(preferredTimezone)

activateソース内の関数に対するこのコメントに示されているように、Django は以前にアクティブ化された最後のタイムゾーンを覚えている可能性があると思います。

def activate(timezone):
    """
    Sets the time zone for the current thread.

    The ``timezone`` argument must be an instance of a tzinfo subclass or a
    time zone name. If it is a time zone name, pytz is required.
    """
    if isinstance(timezone, tzinfo):
        _active.value = timezone

誰かがこれを確認できますか?これを解決する最善の方法は、ミドルウェアで を呼び出すelseステートメントを使用することdeactivateでしょうか?

4

1 に答える 1

2

まず、セッション != 認証。

おそらくステップ 2 と 4 の間 (ユーザーがログインしているとき) に、ビューの 1 つ (またはある種のミドルウェア) でユーザーのセッションを設定します。request.session['django_timezone'] = ...

おそらく、次のような方法でプロファイル情報をセッションに転送します。

request.session['django_timezone']  = request.user.get_profile().prefferedTimezone

そうすれば当然、ユーザーがログアウトしてもセッションは「django_timezone」のままです。

それを利用したくない場合は、まず最初に次のことを行ってください。

if not request.user.is_authenticated():
    timezone.deactivate()

しかし、あなたが自問すべき本当の質問は、私が思うに
、セッションを使用したくないのに、純粋にプロファイルを使用したくないのに、なぜ request.session を使用するのかということです。

于 2012-11-22T12:29:13.933 に答える