我要添加一些自定义授权,以验证登录的用户是否有权访问我的应用程序的特定部分。它不是很漂亮,但是可以工作:view_permissions = { 'admin_list': { 'school':{'userrole':['S','A'], 'usertype':[]}, 'class':{'userrole':['S','A'], 'usertype':[]}, ' ... ' }, 'delete_object': { ... }, 'edit_object': { ... }, }}def check_permissions(request, viewname, objecttype): if(request.user.userrole in view_permissions[viewname][objecttype]['userrole'] or request.user.usertype in view_permissions[viewname][objecttype]['usertype'] ): return True else: return Falsedef delete_object(request, objecttype, objectid): # Redirect to home page if not authorized if(not check_permissions(request, 'delete_object', objecttype)): return redirect('wakemeup:index') # Otherwise, continue processing myobject.delete() ... return admin_list(request, objecttype)我想要做的是将其移动redirect到check_permissions函数内部,如下所示:def check_permissions(request, viewname, objecttype): if( <check permissions are valid> ): pass # Authorized: Do nothing and continue with caller view logic else: return redirect('wakemeup:index') # Unauthorized: redirect to homedef delete_object(request, objecttype, objectid): # Redirect to home page if not authorized check_permissions(request, 'delete_object', objecttype))问题在于,check_permissions函数内部的重定向不执行任何操作。仅当我return在调用逻辑中添加时,它才会重定向:def delete_object(request, objecttype, objectid): # Redirect to home page if not authorized return check_permissions(request, 'delete_object', objecttype))我猜想它与嵌套函数调用有关,它会将其输出一直返回到原始调用者。但是,有没有一种简单的方法可以使重定向从check_permissions函数中正常工作?
1 回答
慕妹3242003
TA贡献1824条经验 获得超6个赞
我认为函数装饰器是解决此问题的完美解决方案。以下内容使您可以检查条件(权限),并在必要时通过重定向劫持响应,如果没有,则继续常规视图响应:
from django.shortcuts import redirect
def check_permissions(view):
view_name = view.__name__
def view_wrapper(*args, **kwargs):
# Check permissions here.
if False or False or True:
# Hijack response with a redirect if conditions not met.
return redirect('wakemeup:index')
# Conditions met, continue with normal response.
return view(*args, **kwargs)
return view_wrapper
@check_permissions
def delete_object(request, object_type, object_id):
# Your normal view...
return
另外,请注意其捕获视图名称的方式。我认为,动态性要强得多。
添加回答
举报
0/150
提交
取消