Python 如何调用函数并形成返回对象以在设置文件中使用?

Python 如何调用函数并形成返回对象以在设置文件中使用?,python,django,django-models,django-middleware,Python,Django,Django Models,Django Middleware,我有一些中间件,它接受一个元组(用户名…它只允许元组中的用户名通过站点的某些区域) 我有一个UserProfile模型,其中包含每个用户的信息,我想对其进行过滤,以便它返回一个用户名元组,用于该中间件——换句话说,设置一个变量BETA_USERS=(动态生成的元组) 你对实现这一目标有什么建议吗 编辑: 因此,元组实际上不是一个重要的细节——下面是一个示例: 通常,我会将其硬编码到设置中: BETA_USERS = ('username1', 'username2', 'username3',

我有一些中间件,它接受一个元组(用户名…它只允许元组中的用户名通过站点的某些区域)

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

你对实现这一目标有什么建议吗

编辑:

因此,元组实际上不是一个重要的细节——下面是一个示例:

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

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