我有一些带有元组的中间件(用户名......它只允许元组中的用户名通过网站的某些区域)。
我有一个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)
我想我真正的问题是,在我的设置文件中调用它的最佳方法是什么?
或者换句话说,在设置文件中分配动态创建的变量的最佳方法是什么?
答案 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