2016-12-22 14 views
6

一个装饰功能(虽然这个问题是特别为约瓶,它可以概括为每个标题)。然而,Flask应用程序被初始化为一个实例变量,即self.server被设置为该应用程序。这意味着我不能使用装饰器,因为self在装饰方法之外未定义。我希望能够做到以下几点:使用</p> <p>我试图用一个类的内部瓶的<code>app.route()</code>装饰定义为实例变量

class MyClass: 

    def __init__(self): 
     self.server = Flask(__name__) 

    @self.server.route('/') 
    def home(): 
     return '<h1>Success</h1>' 

是否有任何解决此问题的方法?任何帮助是极大的赞赏!

回答

2

您可以在__init__方法的上下文中定义该函数。然后,为了使该功能能够正常呼叫,请设置home成员等于它。

class MyClass: 
    def __init__(self): 
     self.server = Flask(__name__) 

     # This is indented at __init__'s level, so a new instance of the function 
     # is defined every time __init__ runs. That means a new instance 
     # is defined for each instance of the class, and so it can be wrapped with 
     # the instance's "self" value. 
     @self.server.route('/') 
     def home_func(): 
      return '<h1>Success</h1>' 

     # Then, you make it an object member manually: 
     self.home = home_func 
+0

谢谢!这很好用 –

+1

我认为这不是一个前瞻性的解决方案,因为最终你将最终得到一个包含所有路由定义及其各自功能的大规模'__init __()'方法。最好使用['add_url_rule()'函数](http://flask.pocoo.org/docs/0.12/api/#flask.Flask.add_url_rule),正如我自己的(和@rumdrums')所解释的那样这个问题。 – YellowShark

+1

在Flask的情况下,这可能会更好。然而,即使对于没有使用Flask的人来说,这也是一个很好的问题。此外,以这种方式定义函数每个函数只比add_url_rule多一行,所以我不认为这种“__init __()'方法”特别重要。 – IanPudney

2

我不知道你的整体使用情况是什么,但是你可以通过不嵌入在一个类中的应用程序对象,而是用瓶的Pluggable Views模块得到更好的服务。这将允许您将您的视图清晰地定义为从flask.views.View继承的类。例如:

import flask 
import flask.views 

class MyClass(flask.views.View): 
    def dispatch_request(self): 
    return '<h1>Success</h1>' 

app.add_url_rule('/test', view_func=MyClass.as_view('home')) 

这是考虑到小例子肯定是更多的代码,但是这给你更多的灵活性来定义其他类或函数用自己的路线,并有可能考虑MethodViews来代替,该定义提供了一个良好的结构多个HTTP方法并将它们与单个类相关联。

3

除了使用route()装饰的,你应该使用self.server对象的add_url_rule method,像这样:

class MyClass: 
    def __init__(self): 
     self.server = Flask(__name__) 
     self.server.add_url_rule('/', 'home', self.home) 
     self.server.add_url_rule('/route-1', 'route-1', self.route_1) 
     self.server.add_url_rule('/route-2', 'route-2', self.route_2) 

    def home(): 
     return '<h1>Success</h1>' 

    def route_1(): 
     ... 

    def route_2(): 
     ... 

该模式允许您定义的路由处理程序作为类的方法,并且是更容易阅读,因为您可以在一个块中看到所有的URL规则。

相关问题