我有 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”功能正常,但“detail”功能出错:
TypeError: wrapper() got an unexpected keyword argument 'id'
附言id 参数在 url 模式中
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^new/(?P<id>\d+)/$', views.new, name = 'new'),
最佳答案
这不是你编写装饰器的方式。装饰器是返回另一个函数的函数;该内部函数必须执行一些逻辑并(可选)调用装饰函数。外部函数本身不接受传递给原始函数的参数;内部函数。
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 .
关于python - wrapper() 得到了一个意外的关键字参数 'id',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48097400/