Как можно передать данные из Flask в обертку (wrap), а затем вывести их на веб-странице?

Здравствуйте! Я разработал обертку (wrap), которая обрабатывает события для вывода HTML-страниц. Этот wrap будет использоваться на нескольких страницах сайта, однако на каждой странице имеются разные переменные, и подключить их все не представляется возможным. Есть ли решение этой проблемы? Я уже искал информацию, но, к сожалению, не нашел подходящих ответов.
  • 29 декабря 2024 г. 16:43
Ответы на вопрос 2
Здравствуйте!

Для передачи данных из Flask в обертку (wrap) и вывода их на веб-странице можно воспользоваться механизмом передачи контекста и параметров в функции рендеринга шаблонов. В Flask это можно сделать с помощью функции `render_template`, передавая необходимые данные в качестве аргументов. Вот общий план действий:

1. **Создайте шаблон с оберткой**: В вашем HTML-шаблоне создайте структуру, используя Jinja2, где вы будете выводить данные, а также отделите обертку от основного контента.

```html
<!-- templates/layout.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{% block title %}My Website{% endblock %}</title>
</head>
<body>
    <header>
        <h1>My Website Header</h1>
    </header>
    <main>
        {% block content %}{% endblock %}
    </main>
    <footer>
        <p>My Website Footer</p>
    </footer>
</body>
</html>
```

2. **Создайте отдельные страницы, наследуя обертку**:

```html
<!-- templates/page1.html -->
{% extends "layout.html" %}

{% block title %}Page 1{% endblock %}

{% block content %}
    <h2>Page 1 Content</h2>
    <p>{{ variable1 }}</p>
{% endblock %}
```

```html
<!-- templates/page2.html -->
{% extends "layout.html" %}

{% block title %}Page 2{% endblock %}

{% block content %}
    <h2>Page 2 Content</h2>
    <p>{{ variable2 }}</p>
{% endblock %}
```

3. **Создайте маршруты в приложении Flask, передавая данные**:

```python
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/page1')
def page1():
    data1 = "Hello from Page 1"
    return render_template('page1.html', variable1=data1)

@app.route('/page2')
def page2():
    data2 = "Hello from Page 2"
    return render_template('page2.html', variable2=data2)

if __name__ == '__main__':
    app.run(debug=True)
```

4. **Запустите приложение и проверьте страницы**. Теперь при переходе по адресам `/page1` и `/page2` будут отображаться страницы с соответствующими данными, а обертка будет оставаться одинаковой.

При использовании этого подхода вы сможете динамически передавать данные в ваши страницы, а обертка будет оставаться универсальной для всех страниц вашего сайта.
Передавайте дополнительные аргументы в декоратор, в чём проблема 
def plugin_page(name, **kwargs):
    def decorator(f):
        @wraps(f)
        def wrapper(*args, **kwargs):
            # Вызов оригинальной функции и получение её результата
            result = f(*args, **kwargs)
            # Объединение результата функции с дополнительными аргументами
            context = {**result, **kwargs}
            return render_template('plugin-' + name.lower() + '.html', **context)

        return wrapper

    return decorator
Похожие вопросы