使用装饰函数定义为variab或

2024-03-28 12:20:03 发布

您现在位置:Python中文网/ 问答频道 /正文

(虽然这个问题是专门针对烧瓶的,但可以根据标题概括)

{cdm>试图在Flask中使用。但是,Flask应用程序初始化为实例变量,即self.server被设置为应用程序。这意味着我不能使用decorator,因为self在decorated方法之外是未定义的。我希望能够做到以下几点:

class MyClass:

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

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

这个问题有什么解决办法吗?非常感谢任何帮助!在


Tags: 实例方法self应用程序标题flaskserver烧瓶
3条回答

您可以在__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

您应该使用self.server对象的^{} method,而不是使用route()修饰符,如下所示:

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规则。在

我不确定您的总体用例是什么,但是最好不要在类中嵌入app对象,而是使用Flask的Pluggable Views模块。这将允许您将视图清晰地定义为继承自烧瓶.视图.视图. 示例:

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方法并将它们与单个类相关联提供了一个很好的结构。在

相关问题 更多 >