为了账号安全,请及时绑定邮箱和手机立即绑定

Django授权-在函数调用中返回重定向

Django授权-在函数调用中返回重定向

四季花海 2021-04-09 19:19:57
我要添加一些自定义授权,以验证登录的用户是否有权访问我的应用程序的特定部分。它不是很漂亮,但是可以工作: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

另外,请注意其捕获视图名称的方式。我认为,动态性要强得多。


查看完整回答
反对 回复 2021-04-20
  • 1 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信