我試圖添加一個access_rights
修飾器到我的Bottle應用程序來檢查訪問路線時的權限。但是,它沒有獲取裝飾函數的參數,這會在嘗試再次調用裝飾函數時導致錯誤。修飾器沒有得到參數
下面是一個使用裝飾的代碼示例:
@route('/users')
@access_rights({'POST': ['admin']})
def users(user):
pass
的user
參數來源於瓶插件,我寫的會從與請求傳遞令牌用戶。這是我目前裝飾:
def access_rights(permissions):
def decorator(f):
def wrapper(*args, **kwargs):
# Check permissions rights here (not implemented yet)
return f(*args, **kwargs)
return wrapper
return decorator
有了這個,我得到TypeError: users() takes exactly 1 argument (0 given)
做GET /users
時,意味着args
和kwargs
都是空的。然而,當我改變裝飾如下,它的工作原理:
def access_rights(permissions):
def decorator(f):
return f
return decorator
我還沒有裝飾做了很多,但是從我的理解,上述兩種實現應該調用users
功能,其原有的參數,但對於第一個沒有得到參數的原因。這是爲什麼?
此代碼適用於我。如果你的第二個裝飾器語法有效,那麼這意味着你沒有使用它的參數:即你只是'@ access_rights'而不是'@access_rights(whatever)'。 –
也許在某處檢查函數名稱?在這種情況下,包裝器上方的@ functools.wrap(f)應該有所幫助。 – Artyer
你使用py2還是py3?我不認爲這會產生巨大的影響,但我很好奇。 –