4

我有一个使用 django.contrib.auth 但没有使用 Django 内置权限系统的应用程序。相反,视图具有 @login_required 装饰器,然后检查用户属于哪个组,并根据组在视图中遵循不同的代码执行分支。

一个用户只能属于一个组。

每次检查用户组似乎太多了,所以我正在尝试编写一个 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

它看起来大致正确(未经测试)。需要注意的一点是,您的中间件必须出现 django.contrib.sessions.middleware.SessionMiddlewareMIDDLEWARE_CLASSES 列表之后,否则在您尝试引用它时不会为您设置会话。

于 2009-12-11T20:13:33.953 回答