2014-01-25 181 views
-3

我正在使用Flask和Flask-Login在Web服務器上工作。它一直在工作,直到我需要將它移動到一個班級。這是因爲裝修的破:之前我有代碼Python裝飾器和類

login_manager = LoginManager(app) 
... 
@login_required 
def control_panel(): 
    return render_template(...) 

但這現在變成:

class webserver: 
    def __init__(self): 
     self.login_manager = LoginManager(app) 

    ... 
    @login_required 
    def control_panel(self): 
     return self.render_template(...) 

的問題是,我真的需要寫,

@self.login_required 

但是無效的語法。我該如何克服這一點?

謝謝!

+0

爲什麼你需要寫'@ self' ? –

+0

因爲它不會識別login_required,因爲它是login_manager的一部分,它變成了self.login_manager – Jacob

+0

這沒有任何意義。如果它是類的一個屬性,它只是「自我」,事實並非如此。 –

回答

0

我不知道你的LoginManager如何創造的裝飾,但你可以把它像這樣工作的:

class LoginManager: 
    def __init__(self, app): 
     pass 

    @staticmethod 
    def login_required(func): 
     def inner(*args, **kwargs): 
      print "login_required: before" 
      func(*args, **kwargs) 
      print "login_required: after" 
     return inner 


class Webserver: 
    def __init__(self): 
     self.login_manager = LoginManager(app) 

    @LoginManager.login_required 
    def control_panel(self): 
     print "control_panel: called" 


app = {} 
ws = Webserver() 
ws.control_panel() 

輸出:

login_required: before 
control_panel: called 
login_required: after 
+0

有些反饋會很好。這是爲你工作嗎?如果不是,爲什麼? – zord

+0

對不起!我不再用班級的方式打擾他,因爲這很複雜。它和以前一樣工作。不過謝謝! – Jacob