gpt4 book ai didi

django - 装饰器失败时显示错误消息

转载 作者:行者123 更新时间:2023-12-04 18:10:01 24 4
gpt4 key购买 nike

装饰器工作正常,但如果用户不属于任何所需的组,我想显示一条错误消息(我想使用消息框架)。这是装饰器:

def group_required(*group_names):
"""Requires user membership in at least one of the groups passed in."""
def in_groups(user):
if user.is_authenticated():
if bool(user.groups.filter(name__in=group_names)) or user.is_superuser:
return True
return False
return user_passes_test(in_groups)

我这样调用它:

@require_http_methods(['GET'])    
@group_required('supervisor')
def home_view(request):
return render(request, 'home.html')

我尝试使用这个 snippet使用消息框架(因为这需要请求对象)但它意识到消息框架中间件似乎没有安装在装饰器中。

我愿意改变一切:)

更新:

我在找什么:

def group_required(request, *group_names):
"""Requires user membership in at least one of the groups passed in."""
def in_groups(user):
if user.is_authenticated():
if user.groups.filter(name__in=group_names).exists() or user.is_superuser:
return True
else:
# I'm getting:
# You cannot add messages without installing django.contrib.messages.middleware.MessageMiddleware
messages.add_message(request, messages.ERROR, 'Group is not allowed')
return False
return user_passes_test(in_groups, request)

最佳答案

我不认为在这个用例中你真的需要 threadlocals。通常,当 threadlocals 似乎是进入 Django 应用程序的唯一方法时,可能会有一些结构错误的上下文层。与 threadlocals 比较,我宁愿复制 user_passes_test 然后修改它以将 request 传递给 in_groups (我们无法传递 无需修改user_passes_test 的代码即可轻松请求is_group。检查问题:How to pass Django request object in user_passes_test decorator callable function。)(也许是为此的门票?)

此外,bool(user.groups.filter(name__in=group_names)) 会导致在决定是否存在之前,使用 exists() 因此 user.groups.filter(name__in=group_names).exists() 直接从数据库后端返回 bool 结果在这里要高效得多。

关于django - 装饰器失败时显示错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16375023/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com