Flask - Невозможно зарегистрировать фильтр до в фабрике приложений - PullRequest
1 голос
/ 01 февраля 2020

В Flask я могу создать фильтр «до» внутри фабрики приложений, только если использую @app.before_request и включить весь код фильтра «* 1002» до »внутри фабрики приложений .

Когда я перемещаю logi c в функцию (register_before_request) и вызываю эту функцию из фабрики приложений, она нарушает стилизацию всех страниц и выдает ошибку в консоль JS.

Вот код, который работает:

def create_app(config_object=ProdConfig):
    """
    An application factory, as explained here:
    http://flask.pocoo.org/docs/patterns/appfactories/
    """

    app = Flask(__name__.split('.')[0])
    app.config.from_object(config_object)

    @app.before_request # <------------------------- this works
    def make_before_request():
        if current_user.is_authenticated and not current_user.status and request.endpoint not in ['main.unconfirmed']:
        return redirect(url_for('main.unconfirmed'))
    ...

    return app

Но я хочу отложить регистрацию фильтра before до отдельной функции , вызываемой из моей фабрики приложений (передача экземпляр app с ним):

def create_app(config_object=ProdConfig):
    """
    An application factory, as explained here:
    http://flask.pocoo.org/docs/patterns/appfactories/
    """

    app = Flask(__name__.split('.')[0])
    app.config.from_object(config_object)
    register_before_request(app) # <------------------------- this doesn't work
    ...

    return app

def register_before_request(app):
    """Register before request actions."""

    def make_before_request():
        if current_user.is_authenticated and not current_user.status and request.endpoint not in ['main.unconfirmed']:
            return redirect(url_for('main.unconfirmed'))

    app.before_request(make_before_request)

По какой-то причине это приводит к тому, что любая страница (не просто main.unconfirmed) отображается полностью не стилизованной, и с этой ошибкой в JavaScript консоль и около 6-7 перенаправлений на одну и ту же страницу:

Uncaught SyntaxError: Unexpected token '<'

Неожиданный токен, на который он ссылается, - это тег <html> (начало веб-страницы).

Вот маршрут:

@blueprint.route('/unconfirmed/', methods=['GET'])
def unconfirmed():
    return render_template('main/main_unconfirmed.html')

Почему это происходит? Я использую этот же шаблон для регистрации расширений, чертежей и прочего, и он отлично работает.

1 Ответ

0 голосов
/ 01 февраля 2020

Похоже, проблема в том, что вы не можете передать функцию в app.before_request.

Итак, это кажется невозможным:

app.before_request(<function>)

Вместо этого @app.before_request должен использоваться в качестве декоратора, но мы можем украсить внутреннюю функцию, которая вызывается из главной фабрики приложений.

Решение:

def register_before_request(app):
    """Register before request actions."""

    @app.before_request # <--------- must use this decorator here
    def make_before_request():
        if current_user.is_authenticated and not current_user.status and request.endpoint not in ['main.unconfirmed']:
            return redirect(url_for('main.unconfirmed'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...