4

django.contrib.auth を使用するアプリがありますが、Django の組み込みのアクセス許可システムは使用しません。代わりに、ビューには @login_required デコレーターがあり、ユーザーが属するグループを確認し、グループに応じてビュー内のコード実行のさまざまな分岐に従います。

ユーザーは 1 つのグループにのみ所属できます。

毎回ユーザーのグループをチェックするのは多すぎるように思われるので、セッションでユーザーのグループを知らせる Django ミドルウェアを作成しようとしています。

以下のコードを見ると、ミドルウェアは希望どおりに動作しますか?

class SetGroupMiddleware(object):
    def process_request(self, request):
        check_if_already_set = request.session.get('thegroup', 'notset')
        if check_if_already_set == 'notset':
            if request.user.id: # User is not AnonymousUser
                groups = request.user.groups.all()
                if groups: # actually this will always be True
                    request.session['thegroup'] = str(groups[0].name) # flowchart of the app ensures that the logged in user will only have one group, and that the user will always have a group
            else:
                request.session['thegroup'] = 'nogroup' # for completeness

次に、必要に応じて request.session['thegroup'] を確認します。

あなたの提案や意見が必要です。このように処理された場合、セッションは安全ですか? これはまったく機能しますか?私は、Django、Python、およびプログラミング全般が初めてです。

ありがとう。

4

3 に答える 3

1

一般的には良さそうです。ただし、もう少し Pythonic にすることもできます。

class SetGroupMiddleware(object):
    def process_request(self, request):
        if 'thegroup' not in request.session:
            if not request.user.is_anonymous():
                groups = request.user.groups.all()
                if groups:
                    request.session['thegroup'] = str(groups[0].name)
            else:
                request.session['thegroup'] = None # for completeness
于 2009-12-11T20:21:23.410 に答える
0

さて、 Steve Loshの回答でコメントしたように、そのコードは意図したとおりに機能しません。

私はそれを次のように修正しました、そしてそれは今まで大丈夫のようです:-

class SetGroupMiddleware(object):
    def process_request(self, request):
        if not request.user.is_anonymous():
            if 'thegroup' not in request.session:
                groups = request.user.groups.all()
                if groups:
                    request.session['thegroup'] = str(groups[0].name)
于 2009-12-14T12:06:09.027 に答える
0

ほぼ正しいように見えます(テストしていません)。注意すべきことの 1 つは、ミドルウェアがMIDDLEWARE_CLASSES リストの django.contrib.sessions.middleware.SessionMiddlewareに出現する必要があることです。そうしないと、セッションを参照しようとした時点でセッションがセットアップされません。

于 2009-12-11T20:13:33.953 に答える