2014-01-25 143 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