0

新しいユーザーごとにユーザーアカウントを自動的に作成してリダイレクトするミドルウェアを入手しました。

class LogNewUser(object):

    def process_request(self, request):

        user_id = request.session.get('uid', None)

        if not user_id:
            user = User.objects.create(username=generate_name())
            request.session['uid'] = user.pk
            return redirect(request.path)

        else:
            request.user = User.objects.get(pk=user_id)

もちろん、ブラウザで Cookie が無効になっていると、無限のリダイレクト ループが作成されます。

ユーザーが Cookie を有効にしているかどうかをテストしたいと思います。有効になっている場合は自分のことを行い、そうでない場合は、Cookie 以外のすべてのユーザーに対して同じになる特定のユーザー オブジェクトを作成します。

request.session.set_test_cookie()と のさまざまな組み合わせを試しrequest.session.test_cookie_worked()ましたが、やりたいことを実行する方法が見つかりません。

4

1 に答える 1

1

課題は、テスト Cookie を設定しようとしたことを示す方法を見つけることであることに気付きました。HTTP はステートレスであるため、これを行う唯一の方法は、リダイレクト先の URL に情報を含めて、ミドルウェアで再び取得することです。

class LogNewUser(object):

    def process_request(self, request):

        if 'testcookie' in request.path:

            next = request.GET.get('next', '/')

            if not request.session.test_cookie_worked():
                return render(request, 'cookie_error.html')

            request.session.delete_test_cookie()

            user = User.objects.create(username=generate_name())
            request.session['uid'] = user.pk
            return redirect(request.GET.get('next', '/'))

        if not request.user.is_authenticated():

            user_id = request.session.get('uid', None)

            if not user_id:

                request.session.set_test_cookie()
                return redirect('/testcookie/?next=%s' % request.path)

            request.user = User.objects.get(pk=uid)

このコードでは、すべての非 Cookie ユーザーに対して User オブジェクトを作成する機能はありません。これは、この手法では、各リクエストでリダイレクトを行わずに POST リクエストを強制終了することができないためです。しかし:

  • ここでは、Cookie を使用しないユーザーに対して、問題を説明するテンプレートへのリダイレクトと、ブラウザーで Cookie を有効にする方法を説明することで、このケースを処理します。
  • 本当に必要な場合は、URL クエリ文字列でセッション IDを使用することで、この問題を回避できます。
于 2012-10-19T12:15:06.567 に答える