Задать вопрос
  • Как исправить ошибку psycopg2.InterfaceError: connection already closed?

    @Atroshchenko-Dima Автор вопроса
    Justa Gain, Я понимаю, что код связанный с БД реализован не лучшим образом, можете подсказать как написать это правильно/лучше? У меня, к сожалению, пока не хватает знаний..
  • Как исправить ошибку psycopg2.InterfaceError: connection already closed?

    @Atroshchenko-Dima Автор вопроса
    Не подскажите как добавить проверку/реакцию на разрыв соединения с базой данных?
    или может быть в целом в моем коде подключение и запрос выполнены некорректно, т.к появляются idle in transaction?

    Так в моем коде реализовано подключение и сам запрос.
    def index():
        # соединение с БД
        with psycopg2.connect(**params) as conn:
            # создание объекта курсора для запуска команд PostgreSQL в базе данных
            cur = conn.cursor()
            cur.execute("SELECT * FROM fact_table;") 
            rows = cur.fetchall()
            cur.close()
        
        if request.method == "POST":
            with psycopg2.connect(**params) as conn:
                # создание объекта курсора для запуска команд PostgreSQL в базе данных
                cur = conn.cursor()
                cur.execute("SELECT {} FROM fact_table WHERE year = ANY(%s) AND indicators = ANY(%s) AND station_name = ANY(%s);"
                            .format(",".join(["\"{}\"".format(c) for c in columns])),(selected_years, selected_indicators, selected_stations))
                # Для получения доступа к сформированной выборке используем cur.fetchall()
                rows = cur.fetchall()
                cur.close()
  • Как сохранить выбранные пользователем параметры в выпадающем списке при срабатывании POST?

    @Atroshchenko-Dima Автор вопроса
    Не подскажите на примере "Выберите год(а)" как это реализовать?
  • Как сделать чтоб при запуске приложения .exe сразу открывался локальный сервер в браузере?

    @Atroshchenko-Dima Автор вопроса
    Спасибо! удалось реализовать таким спосом, только эту часть url = "твоё_приложение"
    webbrowser.open(url)
    в другое место в коде убрал, если оставлять так, то ссылка открывается только при закрытии сервера.
  • Как правильно передать массив данных на сервер и в ссылку для скачивания?

    @Atroshchenko-Dima Автор вопроса
    station = request.form.getlist("station")
            station = [str(i) for i in request.form.getlist("station")]


    В этой части пробовал и request.form.getlist, и request.args.getlist
  • Как визуально оформить select multiple?

    @Atroshchenko-Dima Автор вопроса
    iljaGolubev, спасибо! серверная часть выполнена на flask, первый раз просто фронтом занимаюсь, решил добавить немного JS в оформлении
  • Как визуально оформить select multiple?

    @Atroshchenko-Dima Автор вопроса
    Dmitry Atroshchenko, и script

    Для jquery выполнял на сервере такие команды

    "Предполагая, что у вас уже были установлены Node.js и npm, мы сделали следующее:

    Создайте папку и добавьте в нее какой-нибудь файл (или откройте существующий)
    Установите TSD глобально с помощью следующей команды: npm install tsd -g
    Устанавливаем файл определений типов jQuery в наш проект с помощью следующей команды: tsd install jquery --save"
  • Как визуально оформить select multiple?

    @Atroshchenko-Dima Автор вопроса
    Алексей Уколов, Извиняюсь, за возможно глупые вопросы, я новичок в этом и только разбираюсь еще.
    На сервере вводил данную команду "npm install bootstrap@5.3.0-alpha3", остальные моменты подключения я так понял происходят через CDN
  • Как визуально оформить select multiple?

    @Atroshchenko-Dima Автор вопроса
    iljaGolubev, в консоли вижу данные ошибки
    127.0.0.1 - - [18/May/2023 11:06:08] "POST / HTTP/1.1" 200 -
    127.0.0.1 - - [18/May/2023 11:06:08] "GET /css/bootstrap.min.css HTTP/1.1" 404 -
    127.0.0.1 - - [18/May/2023 11:06:08] "GET /js/jquery.min.js HTTP/1.1" 404 -
    127.0.0.1 - - [18/May/2023 11:06:08] "GET /js/bootstrap.min.js HTTP/1.1" 404 -
    127.0.0.1 - - [18/May/2023 11:06:08] "GET /css/bootstrap-multiselect.css HTTP/1.1" 404 -
    127.0.0.1 - - [18/May/2023 11:06:08] "GET /js/bootstrap-multiselect.js HTTP/1.1" 404 -
    127.0.0.1 - - [18/May/2023 11:06:08] "GET /css/bootstrap.min.css HTTP/1.1" 404 -
    127.0.0.1 - - [18/May/2023 11:06:08] "GET /js/jquery.min.js HTTP/1.1" 404 -
    127.0.0.1 - - [18/May/2023 11:06:08] "GET /js/bootstrap.min.js HTTP/1.1" 404 -
    127.0.0.1 - - [18/May/2023 11:06:08] "GET /js/bootstrap-multiselect.js HTTP/1.1" 404 -
    127.0.0.1 - - [18/May/2023 11:06:08] "GET /css/bootstrap-multiselect.css HTTP/1.1" 404 -


    пункт 2. К сожалению, не знаю как это посмотреть
    пункт 3 и 4 попробовал выполнить, но изменений не произошло
  • Как передать значения из select multiple в переменную?

    @Atroshchenko-Dima Автор вопроса
    Сергей Горностаев, Сергей, заменил на круглые скобки эту часть year = [int(i) for i in request.form.getlist("year") if i.isdigit()], все заработало, спасибо!
  • Как передать значения из select multiple в переменную?

    @Atroshchenko-Dima Автор вопроса
    Сергей Горностаев, Теперь такое

    year = request.form.getlist("year")
    year = [int(i) for i in request.form.getlist["year"] if i.isdigit()]


    Traceback (most recent call last):
      File "C:\Users\antrodmi\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 2528, in wsgi_app
        response = self.full_dispatch_request()
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\antrodmi\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 1825, in full_dispatch_request
        rv = self.handle_user_exception(e)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\antrodmi\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 1823, in full_dispatch_request
        rv = self.dispatch_request()
             ^^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\antrodmi\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 1799, in dispatch_request
        return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\antrodmi\Desktop\factweb3\app.py", line 36, in index
        year = [int(i) for i in request.form.getlist["year"] if i.isdigit()]
                                ~~~~~~~~~~~~~~~~~~~~^^^^^^^^
    TypeError: 'method' object is not subscriptable
  • Как передать значения из select multiple в переменную?

    @Atroshchenko-Dima Автор вопроса
    Сергей Горностаев, написав вот так year = [int(i) for i in request.form["year"] if i.isdigit()], теперь выдает пустую таблицу(только заголовки), а принт на переменную year показывает [2, 0, 1, 5], т.е я выбираю несколько лет, а он в массив выводит только цифры из числа первого выбранного года
  • Как передать значения из select multiple в переменную?

    @Atroshchenko-Dima Автор вопроса
    Сергей Горностаев, К сожалению, я вижу туже самую ошибку.
    ['2015', '2018']
    челябинск
    [2023-05-15 13:11:21,365] ERROR in app: Exception on / [POST]
    Traceback (most recent call last):
      File "C:\Users\antrodmi\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 2528, in wsgi_app
        response = self.full_dispatch_request()
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\antrodmi\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 1825, in full_dispatch_request
        rv = self.handle_user_exception(e)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\antrodmi\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 1823, in full_dispatch_request
        rv = self.dispatch_request()
             ^^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\antrodmi\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 1799, in dispatch_request
        return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\antrodmi\Desktop\factweb3\app.py", line 42, in index
        cur.execute("SELECT * FROM fact_indicators WHERE fact_year = ANY(%s) AND fact_station_name = %s;",(year,station))
    psycopg2.errors.UndefinedFunction: ОШИБКА:  оператор не существует: integer = text
    LINE 1: SELECT * FROM fact_indicators WHERE fact_year = ANY(ARRAY['2...
                                                          ^
    HINT:  Оператор с данными именем и типами аргументов не найден. Возможно, вам следует добавить явные приведения типов.


    измененные отрывки кода

    if request.method == "POST":
            # Получаем промежуток дат из формы
            year = request.form.getlist("year")
            print(year)
            station = request.form["station"]
            print(station)
            # Форматируем даты в соответсвии с форматом в базе данных
            # Запрос к БД с использованием параметров дат
            cur = conn.cursor()
            cur.execute("SELECT * FROM fact_indicators WHERE fact_year = ANY(%s) AND fact_station_name = %s;",(year,station))


    <form method ="post" action="/">
        <label for="year"></label>
        <select type="number" name ="year" multiple="multiple">


    type="number" эту часть пробовал и текс, и убирать - одну и туже ошибку выдает
  • Как передать значения из select multiple в переменную?

    @Atroshchenko-Dima Автор вопроса
    Сергей, спасибо! Эту часть кода изменил, но сейчас вылезла такая ошибка. Не подскажите в чем проблема?

    ['2021', '2022', '2023']
    москва
    [2023-05-15 12:08:30,246] ERROR in app: Exception on / [POST]
    Traceback (most recent call last):
      File "C:\Users\antrodmi\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 2528, in wsgi_app
        response = self.full_dispatch_request()
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\antrodmi\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 1825, in full_dispatch_request
        rv = self.handle_user_exception(e)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\antrodmi\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 1823, in full_dispatch_request
        rv = self.dispatch_request()
             ^^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\antrodmi\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 1799, in dispatch_request
        return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\antrodmi\Desktop\factweb3\app.py", line 42, in index
        cur.execute("SELECT * FROM fact_indicators WHERE fact_year IN (%s) AND fact_station_name = %s;",(year,station))
    psycopg2.errors.UndefinedFunction: ОШИБКА:  оператор не существует: integer = text[]
    LINE 1: SELECT * FROM fact_indicators WHERE fact_year IN (ARRAY['202...
                                                          ^
    HINT:  Оператор с данными именем и типами аргументов не найден. Возможно, вам следует добавить явные приведения типов.


    в html
    <select type="number" name ="year" multiple="multiple">
    дополнительно указал тип, но ошибка не исчезла
  • Как передать значения из select multiple в переменную?

    @Atroshchenko-Dima Автор вопроса
    Виктор Голованенко, Спасибо! но теперь выдает такую ошибку.

    массив данных в sql запрос, я так понимаю, подается вот в таком виде ['2021', '2022', '2023']

    cur.execute("SELECT * FROM fact_indicators WHERE fact_year IN (%s) AND fact_station_name = %s;",(year,station))
    psycopg2.errors.UndefinedFunction: ОШИБКА:  оператор не существует: integer = text[]
    LINE 1: SELECT * FROM fact_indicators WHERE fact_year IN (ARRAY['202...
                                                          ^
    HINT:  Оператор с данными именем и типами аргументов не найден. Возможно, вам следует добавить явные приведения типов.


    добавил еще тип
    <select type="number" name ="year" multiple="multiple">
    , но ошибка не исчезает
  • Как передать значения из select multiple в переменную?

    @Atroshchenko-Dima Автор вопроса
    еще попробовал использовать функцию getlist

    year = request.form.getlist["year"]

    <label for="year"></label>
        <select name ="year" multiple="multiple">


    но тогда вылазит ошибка
    year = request.form.getlist["year"]
               ~~~~~~~~~~~~~~~~~~~~^^^^^^^^
    TypeError: 'method' object is not subscriptable
  • Как получить значение выбранное из выпадающего списка и отправить его на сервер?

    @Atroshchenko-Dima Автор вопроса
    pcdesign, год отображается корректно, а вместо значения выпадающего списка почему-то ставится его порядковый номер, т.е к примеру для станция-3 print выдает 3
  • Как исправить ошибку [Errno 13] Permission denied?

    @Atroshchenko-Dima Автор вопроса
    pcdesign, Большое спасибо! Все работает, только немного изменил эту часть, т.к при filename = filename была ошибка
    return send_from_directory(os.path.dirname(__file__), path=filename, as_attachment=True)