我有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'),
答案 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。