猿问

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

我要添加一些自定义授权,以验证登录的用户是否有权访问我的应用程序的特定部分。它不是很漂亮,但是可以工作:


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 False


def 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 home


def 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函数中正常工作?


四季花海
浏览 162回答 1
1回答

慕妹3242003

我认为函数装饰器是解决此问题的完美解决方案。以下内容使您可以检查条件(权限),并在必要时通过重定向劫持响应,如果没有,则继续常规视图响应:from django.shortcuts import redirectdef check_permissions(view):&nbsp; &nbsp; view_name = view.__name__&nbsp; &nbsp; def view_wrapper(*args, **kwargs):&nbsp; &nbsp; &nbsp; &nbsp; # Check permissions here.&nbsp; &nbsp; &nbsp; &nbsp; if False or False or True:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # Hijack response with a redirect if conditions not met.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return redirect('wakemeup:index')&nbsp; &nbsp; &nbsp; &nbsp; # Conditions met, continue with normal response.&nbsp; &nbsp; &nbsp; &nbsp; return view(*args, **kwargs)&nbsp; &nbsp; return view_wrapper@check_permissionsdef delete_object(request, object_type, object_id):&nbsp; &nbsp; # Your normal view...&nbsp; &nbsp; return另外,请注意其捕获视图名称的方式。我认为,动态性要强得多。
随时随地看视频慕课网APP

相关分类

Python
我要回答