Malmind
@Malmind

Динамический вывод на страницу информации из бд. Flask + pyMySQL?

Нужно отображать информацию из БД на страничке, после добавление записи в базу данных через INSERT. Пробовал просто через js обновлять каждую секунду:
setInterval(function()
{
    $('#main-table').load(document.URL +  ' #main-table');
}, 1000);

Думал дело в том что он не может вызвать функцию повторно, пробовал её вставлять в декоратор. Потом заметил, что единственный способ увидеть изменение в БД это перезапустить проект.
Если какие-то библиотеки, инструменты для решения этой проблемы?
Вот код моего приложения на Flask:
main.py:
from flask import Flask
from flask import render_template
import pymysql
import pymysql.cursors

app = (Flask(__name__))

try:
    connection = pymysql.connect(
        host='localhost',
        port=3306,
        user='admin',
        password='123',
        database='dynamic_output',
        cursorclass=pymysql.cursors.DictCursor
    )
    print("Good")
except Exception as ex:
    print('Bad')
    print(ex)


def select_all():
    with connection.cursor() as cursor:
        select_all = "select * from names"
        cursor.execute(select_all)
        return cursor.fetchall()


@app.route('/')
def index():
    return render_template("index.html", select=select_all())


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


templates/index.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
      .main-table{
          position: absolute;
          top: 50%;
          left: 50%;
          transform: translate(-50%, -50%);

          width: 600px;
          border-collapse: collapse;
          border: 1px solid #F2F2F2;
          box-shadow: 0px 0px 20px rgb(0 0 0 / 8%);
      }

      .title-table{
          text-align: start;
          font-size: 23px;
      }

      .content-table{
          font-size: 20px;
      }

    .table-item{
        padding: 20px;
        border: 1px solid #F2F2F2;
    }
    </style>
</head>
<body>
    <table class="main-table" id="main-table">
        <tr class="table-string">
            {% for key in select[0].keys() %}
                <th class="title-table table-item"> {{ key }}</th>
            {% endfor %}
        </tr>
        {% for lib in select %}
            <tr class="table-string">
                {% for key, value in lib.items() %}
                    <td class="content-table table-item"> {{ value }} </td>
                {% endfor %}
            </tr>
        {% endfor %}
    </table>
</body>
</html>

Скрипт для создания БД:
create database dynamic_output;
use dynamic_output;

CREATE TABLE IF NOT EXISTS `dynamic_output`.`names` (
  `id` INT NOT NULL,
  `name` VARCHAR(45) NULL,
  `age` INT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;

INSERT INTO names (id, name, age) VALUES (1, 'Jhon', 25);
  • Вопрос задан
  • 603 просмотра
Решения вопроса 1
Malmind
@Malmind Автор вопроса
Решил проблему с помощью SQLAlchemy. Заменил вот этот код, в файле main.py:
import pymysql
import pymysql.cursors

app = (Flask(__name__))

try:
    connection = pymysql.connect(
        host='localhost',
        port=3306,
        user='admin',
        password='123',
        database='dynamic_output',
        cursorclass=pymysql.cursors.DictCursor
    )
    print("Good")
except Exception as ex:
    print('Bad')
    print(ex)


def select_all():
    with connection.cursor() as cursor:
        select_all = "select * from names"
        cursor.execute(select_all)
        return cursor.fetchall()

На:
import sqlalchemy

engine = sqlalchemy.create_engine('mysql+pymysql://admin:123@localhost/dynamic_output')
res = engine.execute('SELECT * FROM names') 
rows = res.fetchall()

Последние две строчки надо вставить в декоратор, чтобы они вызывались.
И добавил функцию, которая через определённый момент времени делает запрос на сервер:
setInterval(function()
{
    $('#main-table').load(document.URL +  ' #main-table'); // #main-table id блока который нужно обновлять
}, 2000);

Я делал тоже самое но с pyMySQL, но это не работало почему-то
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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