0

我有一些中间件需要一个元组(用户名......它只允许元组中的用户名通过网站的某些区域)。

我有一个 UserProfile 模型,其中包含有关每个用户的信息,我想对其进行过滤,以便它返回一个用户名元组以供此中间件使用——换句话说,设置一个变量 BETA_USERS = (dynamically-generated-tuple)。

你有什么建议来完成这个吗?

编辑:

所以,元组真的不是一个重要的细节——这里有一个例子:

通常,我会将其硬编码到设置中:

BETA_USERS = ('username1', 'username2', 'username3', 'username4')

但是,我有一个包含 Beta 列的 UserProfile 模型,可以将其设置为 1。注册 Beta 的前 50 人将设置为 1,其他人设置为 0。因此,我可以通过调用模型对象上的过滤器方法:

users = UserProfile.objects.filter(beta='1')

我可以用这个奇怪的小循环把它变成一个很好的元组:

for user in users:
    list.append((user.user.username).upper())
return tuple(list)

我想我真正的问题是,在我的设置文件中调用它的最佳方式是什么?

或者,换一种说法,在设置文件中分配动态创建的变量的最佳方法是什么?

4

4 回答 4

2

您还可以使用@user_passes_test装饰器将视图限制为特定的用户子集。或者创建自己的装饰器:

from django.utils.functional import wraps

def beta(view):
    @wraps(view)
    def inner(request, *args, **kwargs):
        if request.user.user_profile.beta:
            return view(request, *args, **kwargs)
        # Up to you how you return failure...
    return inner

现在您可以将其用作:

@beta
def my_view(request):
    # do something new here.

替代方案是:

@user_passes_test(lambda u: u.profile.beta)
def my_view(request):
    # do something clever

表单的优点@beta是它更容易重复使用。

于 2011-01-07T08:06:00.553 回答
0

我不确定我是否正确理解了您的问题。是这样的吗?

>>> allowed_users = ("John", "Eric", "Graham", "Terry")
>>> current_users = ("Connie", "John", "Ian", "Terry")
>>> tuple(user for user in current_users if user in allowed_users)
('John', 'Terry')

一个更好的解决方案(感谢 sukhbir 提醒我!):

>>> set(allowed_users) & set(current_users)
{'John', 'Terry'}

或者,如果结果必须是一个元组:

>>> tuple(set(allowed_users) & set(current_users))
('John', 'Terry')

使用集合时唯一的缺点是不一定会保留顺序。

于 2011-01-07T06:08:36.347 回答
0

首先想到的是构建一个列表,然后调用 tuple(),或者使用生成每个用户名的生成器函数动态创建一个元组。无论哪种方式,您都需要为您的数据构建一个接口。我浏览了这个站点,看来您的数据最好通过访问对象的全局对象的接口来访问。只需遍历您的 django.model 对象并提取您的用户名,每次都生成用于生成元组的生成器。

于 2011-01-07T06:09:40.493 回答
0

蒂姆有一个很好的答案,如果你想继续做你现在做的事情。

但是,django 提供了一个很好的方法,通过自定义权限只让一些人进入站点的区域。

您应该实现它们并装饰需要权限的视图@permission_required

于 2011-01-07T06:22:00.987 回答