Удаление строки по истечению времни

Рейтинг: 0Ответов: 1Опубликовано: 04.05.2023

Мне нужно записывать мои IP адреса, имя и время на которое IP отправляется в бд в базу данных. Подскажите как реализовать функцию, для удаления из бд как только время которое я выбрал истечет. Сделано на Flask.

Вот код:

<form action="/block" method="POST">
  <label for="ip_address">IP Address:</label>
  <input type="text" id="ip_address" name="ip_address"><br>

  <label for="block_period">Amount of Block:</label>
  <select id="block_period" name="block_period">
    <option value="1 hour">1 Hour</option>
    <option value="24 hours">24 Hours</option>
    <option value="3 days">3 Days</option>
    <option value="1 week">1 Week</option>
    <option value="1 month">1 Month</option>
  </select><br>

  <label for="user">User:</label>
  <select id="user" name="user">
    <option value="user3">user3</option>
    <option value="user4">user4</option>
    <option value="user5">user5</option>
  </select><br>

  <button id="submitButton">Block</button>
</form>
@app.route('/', methods=['GET', 'POST'])
def index():
    return render_template('index.html')


@app.route('/block', methods=['POST'])
def block():
    ip_address = request.form['ip_address']
    block_period = request.form['block_period']
    user = request.form['user']

    add_to_database(ip_address, block_period, user)

    return 'Data successfully added to database!'


def add_to_database(ip_address, block_period, user):
    conn = sqlite3.connect('ip_blocker.db')
    c = conn.cursor()

    # Create table if it doesn't exist
    c.execute('''CREATE TABLE IF NOT EXISTS blocked_ips
                 (ip_address text, block_period text, user text, block_time timestamp)''')

    # Insert data into table
    block_time = datetime.now()
    c.execute("INSERT INTO blocked_ips VALUES (?, ?, ?, ?)", (ip_address, block_period, user, block_time))

    conn.commit()
    conn.close()

    # Add IP address to the list of blocked IPs
    blocked_ips.append(ip_address)

    # Start a new thread to remove IP address from the list and database after block period
    t = threading.Thread(target=remove_ip_address, args=(ip_address, block_time))
    t.start()

вот сам метод remove ip address для удаления, но почему-то не работает. Жду час. не удаляется.

def remove_ip_address(ip_address, block_time):
    # Wait for the block period to end
    block_period_seconds = int(block_period) * 60
    time.sleep(block_period_seconds)

    # Remove IP address from the list of blocked IPs
    blocked_ips.remove(ip_address)

    # Remove IP address from the database
    conn = sqlite3.connect('ip_blocker.db')
    c = conn.cursor()
    c.execute("DELETE FROM blocked_ips WHERE ip_address=?", (ip_address,))
    conn.commit()
    conn.close()

    # Save IP address to CSV file
    with open('blocked_ips.csv', mode='a') as csv_file:
        writer = csv.writer(csv_file)
        writer.writerow([ip_address, block_period, user, block_time])

Буду рад помощи. Спасибо!

Ответы

▲ 0

Мне кажется неверным вычисление времени в remove_ip_address. На входе block_time (больше подходит time_stamp ), но он не используется, а формула int(bloked_period)*60 не понятна так как период задан в разных единицах , по крайней мере в html. Необходимо прочитать штамп времени(начало блокировки) добавить к нему время блокировки и сравнив с текущим ждать.