如何在我的设置文件中调用函数并形成一个返回对象?

时间:2011-01-07 05:43:00

标签: python django django-models django-middleware

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

我有一个UserProfile模型,其中包含有关每个用户的信息,我想过滤它以便它返回一个用户名的元组以用于此中间件 - 换句话说,设置变量BETA_USERS =(动态生成的元组) )。

您对此有何建议?

修改

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

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

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

但是,我有一个UserProfile模型,其中包含一个Beta列,可以设置为1.注册测试版的前50个人将设置为1,其他人都为0.所以,我可以轻松过滤这个通过在模型对象上调用过滤器方法:

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

我可以通过这个奇怪的小循环使它成为一个很好的元组:

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

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

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

4 个答案:

答案 0 :(得分: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形式的优势在于它更容易重复使用。

答案 1 :(得分: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')

使用集合时唯一的缺点是订单不一定会被保留。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

但是,django提供了一种通过custom permissions让一些人进入网站区域的好方法。

您应该实现它们并使用@permission_required

装饰需要权限的视图