jke*_*esh 6 django permissions decorator
我不确定这是可能的,但有没有办法写出类似的东西
@group_required('group_id')
def myview(request, group_id):
.....
Run Code Online (Sandbox Code Playgroud)
我在哪里查看参数group_id的值,并将此视图的访问权限仅限于此组中的人员?
我知道可以创建一个装饰器来检查某个特定组的成员资格
@group_required('admin')
def myview(request):
....
Run Code Online (Sandbox Code Playgroud)
但是我想要一个只能由某个组内的人访问的视图,这个视图由网址决定.
所以举个例子
/group/1
/group/2
Run Code Online (Sandbox Code Playgroud)
每个人都应该拥有权限,以便只有#X组的成员才能看到该页面.我可以在视图中轻松编写此功能
group = get group
if user not in group
raise 404
Run Code Online (Sandbox Code Playgroud)
但这种逻辑在全世界都在重复.装饰者似乎是一种很有前途的方式,但似乎范围是倒退的.还有另一种处理此类权限的首选方法吗?
谢谢!
装饰器可以访问所有视图参数,所以这绝对是可能的。你可以这样做:
def group_required(arg_name):
def decorator(view):
def wrapper(request, *args, **kwargs):
group_id = kwargs.get(arg_name)
user = request.user
if group_id in user.groups.values_list('id', flat=True):
return view(request, *args, **kwargs)
else:
return HttpResponseForbidden # 403 Forbidden is better than 404
return wrapper
return decorator
Run Code Online (Sandbox Code Playgroud)
(如果您不需要在装饰器中动态定义参数的灵活性,例如,如果您总是调用它group_id,那么您可以在这里错过外部函数并只使用kwargs.get('group_id')。)
| 归档时间: |
|
| 查看次数: |
1696 次 |
| 最近记录: |