|
11 | 11 | DATABASE_URL = os.getenv('DATABASE_URL') |
12 | 12 |
|
13 | 13 | app = Flask(__name__) |
14 | | -app.secret_key = 'SECRETFORMYPROJECT007' |
| 14 | +app.secret_key = os.getenv('SECRET_KEY') |
15 | 15 |
|
16 | 16 |
|
17 | 17 | def get_db_connection(): |
18 | 18 | conn = psycopg2.connect(DATABASE_URL) |
19 | 19 | return conn |
20 | 20 |
|
21 | 21 |
|
22 | | -@app.route('/', methods=['GET', 'POST']) |
| 22 | +@app.route('/', methods=['GET']) |
23 | 23 | def index(): |
24 | | - if request.method == 'POST': |
25 | | - url_input = request.form.get('url') |
26 | | - # Проверка валидности |
27 | | - if not validators.url(url_input) or len(url_input) > 255: |
28 | | - # Редирект на /urls с этим же URL |
29 | | - return redirect(url_for('urls', url=url_input)) |
30 | | - else: |
31 | | - return redirect(url_for('urls', url=url_input)) |
32 | 24 | return render_template('index.html') |
33 | 25 |
|
34 | | -@app.route('/urls', methods=['GET', 'POST']) |
35 | | -def urls(): |
36 | | - if request.method == 'POST': |
37 | | - url = request.form['url'] |
38 | | - return redirect(url_for('urls', url=url)) |
39 | | - else: |
40 | | - url = request.args.get('url') |
41 | | - if url: |
42 | | - if not validators.url(url) or len(url) > 255: |
43 | | - flash('Некорректный URL', 'error') |
44 | | - return render_template('index.html'), 422 # Возвращаем ошибку 422 с HTML |
45 | | - |
46 | | - domain = urlparse(url).netloc |
47 | | - |
48 | | - with get_db_connection() as conn: |
49 | | - with conn.cursor() as cur: |
50 | | - try: |
51 | | - cur.execute('SELECT id FROM urls WHERE name = %s', (domain,)) |
52 | | - existing_url = cur.fetchone() |
53 | | - |
54 | | - if existing_url: |
55 | | - url_id = existing_url[0] |
56 | | - flash('Страница уже существует', 'error') |
57 | | - return redirect(url_for('url_detail', url_id=url_id)) |
58 | | - |
59 | | - cur.execute('INSERT INTO urls (name) VALUES (%s) RETURNING id', (domain,)) |
60 | | - url_id = cur.fetchone()[0] |
61 | | - conn.commit() |
62 | | - flash('Страница успешно добавлена', 'success') |
63 | | - |
64 | | - return redirect(url_for('url_detail', url_id=url_id)) |
65 | | - except Exception as e: |
66 | | - conn.rollback() |
67 | | - flash(f'Произошла ошибка: {str(e)}', 'error') |
68 | | - |
69 | | - # Если URL не передан, или если запрос POST без URL, получаем все URL из БД |
70 | | - with get_db_connection() as conn: |
71 | | - with conn.cursor() as cur: |
72 | | - cur.execute(''' |
73 | | - SELECT u.id, u.name, u.created_at, |
74 | | - uc.status_code, uc.created_at AS last_check, |
75 | | - uc.h1, uc.title, uc.description |
76 | | - FROM urls u |
77 | | - LEFT JOIN url_checks uc ON u.id = uc.url_id |
78 | | - AND uc.created_at = ( |
79 | | - SELECT MAX(created_at) |
80 | | - FROM url_checks |
81 | | - WHERE url_id = u.id |
82 | | - ) |
83 | | - ''') |
84 | | - urls = cur.fetchall() |
85 | | - return render_template('urls.html', urls=urls) |
| 26 | + |
| 27 | +@app.route('/urls', methods=['POST']) |
| 28 | +def create_url(): |
| 29 | + url_input = request.form.get('url') |
| 30 | + error_message = None |
| 31 | + |
| 32 | + # Валидация URL |
| 33 | + if not url_input or len(url_input) > 255: |
| 34 | + error_message = "Некорректный URL или превышена длина 255 символов." |
| 35 | + elif not validators.url(url_input): |
| 36 | + error_message = "Некорректный URL." |
| 37 | + |
| 38 | + if error_message: |
| 39 | + flash(error_message, 'error') |
| 40 | + return render_template('index.html', url=url_input), 422 # Возвращаем ошибку 422 с HTML |
| 41 | + |
| 42 | + # Нормализация URL |
| 43 | + normalized_url = url_input.strip() |
| 44 | + |
| 45 | + # Проверка на наличие URL в базе данных |
| 46 | + with get_db_connection() as conn: |
| 47 | + with conn.cursor() as cur: |
| 48 | + cur.execute('SELECT id FROM urls WHERE name = %s', (normalized_url,)) |
| 49 | + existing_url = cur.fetchone() |
| 50 | + |
| 51 | + if existing_url: |
| 52 | + url_id = existing_url[0] |
| 53 | + flash('Страница уже существует', 'error') |
| 54 | + return redirect(url_for('url_detail', url_id=url_id)) |
| 55 | + |
| 56 | + # Сохранение нового URL в базу данных |
| 57 | + cur.execute('INSERT INTO urls (name) VALUES (%s) RETURNING id', (normalized_url,)) |
| 58 | + url_id = cur.fetchone()[0] |
| 59 | + conn.commit() |
| 60 | + flash('Страница успешно добавлена', 'success') |
| 61 | + |
| 62 | + return redirect(url_for('url_detail', url_id=url_id)) |
| 63 | + |
| 64 | + |
| 65 | +@app.route('/urls', methods=['GET']) |
| 66 | +def list_urls(): |
| 67 | + with get_db_connection() as conn: |
| 68 | + with conn.cursor() as cur: |
| 69 | + cur.execute(''' |
| 70 | + SELECT u.id, u.name, u.created_at, |
| 71 | + uc.status_code, uc.created_at AS last_check, |
| 72 | + uc.h1, uc.title, uc.description |
| 73 | + FROM urls u |
| 74 | + LEFT JOIN url_checks uc ON u.id = uc.url_id |
| 75 | + AND uc.created_at = ( |
| 76 | + SELECT MAX(created_at) |
| 77 | + FROM url_checks |
| 78 | + WHERE url_id = u.id |
| 79 | + ) |
| 80 | + ''') |
| 81 | + urls = cur.fetchall() |
| 82 | + return render_template('urls.html', urls=urls) |
| 83 | + |
86 | 84 |
|
87 | 85 |
|
88 | 86 |
|
|
0 commit comments