Python 如何调用函数并形成返回对象以在设置文件中使用?
我有一些中间件,它接受一个元组(用户名…它只允许元组中的用户名通过站点的某些区域) 我有一个UserProfile模型,其中包含每个用户的信息,我想对其进行过滤,以便它返回一个用户名元组,用于该中间件——换句话说,设置一个变量BETA_USERS=(动态生成的元组) 你对实现这一目标有什么建议吗 编辑: 因此,元组实际上不是一个重要的细节——下面是一个示例: 通常,我会将其硬编码到设置中:Python 如何调用函数并形成返回对象以在设置文件中使用?,python,django,django-models,django-middleware,Python,Django,Django Models,Django Middleware,我有一些中间件,它接受一个元组(用户名…它只允许元组中的用户名通过站点的某些区域) 我有一个UserProfile模型,其中包含每个用户的信息,我想对其进行过滤,以便它返回一个用户名元组,用于该中间件——换句话说,设置一个变量BETA_USERS=(动态生成的元组) 你对实现这一目标有什么建议吗 编辑: 因此,元组实际上不是一个重要的细节——下面是一个示例: 通常,我会将其硬编码到设置中: BETA_USERS = ('username1', 'username2', 'username3',
BETA_USERS = ('username1', 'username2', 'username3', 'username4')
但是,我有一个UserProfile模型,它包含一个Beta列,可以设置为1。前50个注册测试版的人将被设置为1,其他人设置为0。因此,我可以通过在模型对象上调用filter方法来轻松过滤:
users = UserProfile.objects.filter(beta='1')
我可以用这个奇怪的小循环制作一个很好的元组:
for user in users:
list.append((user.user.username).upper())
return tuple(list)
我想我真正的问题是,在我的设置文件中调用它的最佳方式是什么
或者,换句话说,在设置文件中分配动态创建的变量的最佳方法是什么?我不确定是否正确理解了您的问题。是这样的吗
>>> 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提醒我!):
或者,如果结果必须是元组:
>>> tuple(set(allowed_users) & set(current_users))
('John', 'Terry')
使用集合的唯一缺点是不一定会保留顺序。首先想到的是构建一个列表,然后调用tuple(),或者使用生成每个用户名的生成器函数动态生成一个tuple。无论哪种方式,您都需要为数据构建一个接口。我浏览了一下,您的数据似乎最好通过访问对象全局对象的接口来访问。只需遍历django.model对象并提取用户名,每次都会生成一个用于生成元组的生成器。如果您想继续执行当前的操作,Tim有一个很好的答案 但是,django提供了一种很好的方式,只允许一些人通过
您应该实现它们并使用
@permission\u required
装饰需要权限的视图。您还可以使用@user\u passes\u 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
表单的优点是它更易于重用。这里使用元组理解有什么原因吗set(允许的用户)和set(当前的用户)
——这不是更好吗?@sukhbir:你完全正确。我一点也没想到布景。反对设置的唯一原因可能是它们无序。这对于特定的应用程序来说是好的,但通过“登录门”配置,我可以快速定义项目中任何地方的URL以限制访问(对于站点维护或..beta功能特别有用..)您可以对装饰器执行相同的操作:设置检查中的havepermissions检查+标志。然后你可以在“设置”中更改标志(或者根据你的决定),然后你就可以离开了。嗯,我还需要进一步了解一下。不过似乎很有用。您的上一个代码示例可以简化为返回元组(user.user.username.upper(),用于用户中的用户)
我喜欢这样。我们将实施它。
@user_passes_test(lambda u: u.profile.beta)
def my_view(request):
# do something clever