【问题标题】:wrapper() got an unexpected keyword argument 'id'wrapper() 得到了一个意外的关键字参数“id”
【发布时间】:2018-01-04 22:46:20
【问题描述】:

我有 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() 得到了一个意外的关键字参数 'id'

附: id-parameter 在 url-patterns 中

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

【问题讨论】:

    标签: python django-views


    【解决方案1】:

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

    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

    【讨论】:

      【解决方案2】:

      我会这样解决:

      #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)
      

      【讨论】:

      • 这就是答案
      猜你喜欢
      • 1970-01-01
      • 2020-09-24
      • 2016-09-17
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 2021-03-17
      相关资源
      最近更新 更多