我可以为Django @login_required自定义动态login_url吗?

时间:2017-02-25 05:52:22

标签: python django django-login

执行此装饰器@login_required的基本方法是这样的;

@login_required(login_url='/path/to/login/')
def foobar(request):
    # do stuff

在此,我想将login_url的此值设置为request.GET.next的动态路径。我可以吗?

更新,我尝试了这个,但当然这应该返回错误(request)未定义,因为在争论之前采取。

def dynamic_url(request):
    get_next = request.GET.get('next')
    if get_next:
        return get_next
    return '/accounts/login/'

@login_required(login_url=dynamic_url(request))
def foobar(request):
    # do stuff

1 个答案:

答案 0 :(得分:0)

我认为有两种方法可以做到这一点:

第一个不是要使用装饰器并在视图函数中检查你的状态,如下所示:

def foo(request):
    if not request.user.is_authenticated:
        # Do your staffs
        # get_next = request.GET.get('next')
        # if get_next:
        #     return get_next
        # return ''

第二方式是我未测试过的方式: 我可以看到here django login_requred()装饰器可以获得一个名为 function 的变量,并将装饰器响应传递给此函数(如果不是None)尝试将 dynamic_url 函数传递给login_required()装饰器,如下所示:

login_required(function=dynamic_url)
def foo(request):
    pass

并告诉我们结果:)