2014-09-27 90 views
1

目前,我正在運行一個Python瓶的應用程序,利用以下的裝飾:瓶 - 得到了關鍵字參數「EVENTID」多值 - 裝飾

def login_required(fn): 
    @wraps(fn) 
    def wrapper(*args, **kwargs): 
     if 'phone' in session: 
      user = User.query.filter_by(phone = session['phone']).first() 
      if user: 
       return fn(user, *args, **kwargs) 
      else: 
       return redirect(url_for('login')) 
    return wrapper 

我有以下看法:

@app.route('/delete/<eventid>') 
@login_required 
def delete(eventid): 

正由下面的行稱爲:

url_for('delete', eventid=event.uid) 

這將產生以下的錯誤:

delete() got multiple values for keyword argument 'eventid' 

delete()函數在不使用裝飾器時起作用。 修飾符在不與delete()函數一起使用時工作。

我該如何解決這個問題?

回答

2

你的包裝函數傳遞一個附加參數user的裝飾功能(在這種情況下delete

return fn(user, *args, **kwargs) 

但你delete功能只叫eventid一個ARG。 Python將第一個arg(用戶)解釋爲eventid arg,但隨後爲同一名稱獲取另一個關鍵字參數,因此出現奇怪的錯誤消息。

它本質上是這樣的:

>>> def delete(eventid): 
    print eventid 

>>> delete('user', eventid='test') 
Traceback (most recent call last): 
    File "<pyshell#3>", line 1, in <module> 
    delete('user', eventid='test') 
TypeError: delete() got multiple values for keyword argument 'eventid' 

所以它的工作原理沒有,因爲沒有用戶ARG傳入的裝飾只需添加用戶作爲第一個參數來刪除功能。

相關問題