将通用功能放入 Flask 子类中

Dan*_*bbs 5 python flask

我有一个网站,其中有多个 Flask 应用程序,它们都具有一些共同的属性,因此我创建了以下类:

import flask

class MyFlaskApp(flask.Flask):
    def__init__(self, import_name):
        super(MyFlaskApp, self).__init__(import_name)
        # Set up some logging and template paths.

    @self.errorhandler(404)
    def my_404(self, error):
        return flask.render_template("404.html"), 404

    @self.before_request
    def my_preprocessing(self):
        # Do stuff to flask.request
Run Code Online (Sandbox Code Playgroud)

然后我拥有的任何其他 Flask 应用程序都可以使用它,如下所示:

from myflaskapp import MyFlaskApp

app = MyFlaskApp(__name__)

@app.route("/my/path/")
def my_path():
    return "I'm a pirate, prepare to die!"
Run Code Online (Sandbox Code Playgroud)

然而,我似乎无法在类定义的上下文中使用这些装饰器。我还能怎样实现这一目标?

Mar*_*ers 5

您可以将您的注册移至__init__方法中;那一刻有一个self参考:

class MyFlaskApp(flask.Flask):
    def__init__(self, import_name):
        super(MyFlaskApp, self).__init__(import_name)
        # Set up some logging and template paths.
        self.register_error_handler(404, self.my_404)
        self.before_request(self.my_preprocessing)

    def my_404(self, error):
        return flask.render_template("404.html"), 404

    def my_preprocessing(self):
        # Do stuff to flask.request
Run Code Online (Sandbox Code Playgroud)

我没有使用@app.errorhandler()装饰器,而是使用了稍微更方便的app.register_error_handler()方法,但您仍然可以使用

self.errorhandler(404)(self.my_404)
Run Code Online (Sandbox Code Playgroud)

如果你真的想的话。Flask 对象上的注册装饰器都只是注册,它们不会改变装饰函数或提供替换。