wrapper()得到了一个意外的关键字参数'id'

时间:2018-01-04 14:30:22

标签: python django-views

我有wiev功能:

@login_required
def index(request):

@login_required
def detail(request, id):

装饰:

@decorator
def login_required(wiev_function, request, *args, **kwargs):
    print(args)
    print(kwargs)
    if not request.user.is_authenticated():
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
    return wiev_function(request, *args, **kwargs)

“index”功能正常工作,但“详细信息”显示错误:

  

TypeError:wrapper()得到一个意外的关键字参数'id'

P.S。 id-parameter在url-patterns

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^new/(?P<id>\d+)/$', views.new, name = 'new'),

2 个答案:

答案 0 :(得分:1)

我会这样解决:

#decorator
def login_required(func):
    def wrapper(*args, **kwargs):
        if not args[0]:
            return print('not valid')
        return func(*args, **kwargs)
    return wrapper

@login_required
def index(request):
    print('1')

@login_required
def detail(request, id):
    print('2')

index(True)
index(False)
detail(True, 1)
detail(False, 1)

答案 1 :(得分:0)

这不是你写装饰的方式。装饰器是返回另一个函数的函数;然后内部函数必须执行一些逻辑并(可选)调用修饰函数。外部函数本身不接受传递给原始函数的参数;内在的功能。

def login_required(view_function):
    def inner(request, *args, **kwargs):
        print(args)
        print(kwargs)
        if not request.user.is_authenticated():
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        return view_function(request, *args, **kwargs)
    return inner

然而,由于Django已经提供login_required decorator

,所有这一切似乎都毫无意义