55from dotenv import load_dotenv
66import validators
77from bs4 import BeautifulSoup
8-
9-
8+ from urllib .parse import urlparse
109
1110load_dotenv ()
1211DATABASE_URL = os .getenv ('DATABASE_URL' )
@@ -28,28 +27,28 @@ def index():
2827 flash ('Некорректный URL' , 'error' )
2928 return redirect (url_for ('index' ))
3029
30+ # Извлекаем домен из URL
31+ domain = urlparse (url ).netloc
32+
3133 conn = get_db_connection ()
3234 cur = conn .cursor ()
3335 try :
34- # Проверяем, существует ли уже этот URL
35- cur .execute ('SELECT id FROM urls WHERE name = %s' , (url ,))
36+ # Проверяем, существует ли уже этот домен
37+ cur .execute ('SELECT id FROM urls WHERE name = %s' , (domain ,))
3638 existing_url = cur .fetchone ()
3739
3840 if existing_url :
39- # Если URL уже существует, перенаправляем на его детали
41+ # Если домен уже существует, перенаправляем на его детали
4042 url_id = existing_url [0 ]
4143 flash ('Страница уже существует' , 'error' )
4244 return redirect (url_for ('url_detail' , url_id = url_id ))
4345
44- # Если URL не существует, добавляем его
45- cur .execute ('INSERT INTO urls (name) VALUES (%s)' , (url ,))
46+ # Если домен не существует, добавляем его
47+ cur .execute ('INSERT INTO urls (name) VALUES (%s) RETURNING id' , (domain ,))
48+ url_id = cur .fetchone ()[0 ]
4649 conn .commit ()
4750 flash ('Страница успешно добавлена' , 'success' )
4851
49- # Получаем ID добавленного URL для перенаправления
50- cur .execute ('SELECT id FROM urls WHERE name = %s' , (url ,))
51- url_id = cur .fetchone ()[0 ]
52-
5352 return redirect (url_for ('url_detail' , url_id = url_id ))
5453 except Exception as e :
5554 conn .rollback ()
@@ -68,18 +67,18 @@ def urls():
6867
6968 # Объединяем запросы для получения всех URL и последней проверки
7069 cur .execute ('''
71- SELECT u.id, u.name, u.created_at,
72- uc.status_code, uc.created_at AS last_check,
73- uc.h1, uc.title, uc.description
74- FROM urls u
75- LEFT JOIN url_checks uc ON u.id = uc.url_id
76- AND uc.created_at = (
77- SELECT MAX(created_at)
78- FROM url_checks
79- WHERE url_id = u.id
80- )
81- ORDER BY u.created_at DESC
82- ''' )
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+ ORDER BY u.created_at DESC
81+ ''' )
8382 urls = cur .fetchall ()
8483
8584 cur .close ()
@@ -104,6 +103,8 @@ def url_detail(url_id):
104103 return render_template ('result.html' , url = url , checks = checks )
105104
106105
106+ from urllib .parse import urlparse
107+
107108@app .route ('/check_url/<int:url_id>' , methods = ['POST' ])
108109def add_check (url_id ):
109110 conn = get_db_connection ()
@@ -113,11 +114,16 @@ def add_check(url_id):
113114 url = cur .fetchone ()
114115
115116 if url is None :
116- flash ('URL не найден.' )
117+ flash ('URL не найден.' , 'error' )
117118 return redirect (url_for ('urls' ))
118119
119120 url_name = url [0 ]
120121
122+ # Проверка и добавление схемы к URL, если она отсутствует
123+ parsed_url = urlparse (url_name )
124+ if not parsed_url .scheme :
125+ url_name = 'http://' + url_name # Добавляем http по умолчанию
126+
121127 try :
122128 response = requests .get (url_name )
123129 response .raise_for_status () # Проверка на ошибки HTTP
@@ -134,24 +140,26 @@ def add_check(url_id):
134140 title_content = title_tag .text if title_tag else None
135141 description_content = description_tag ['content' ] if description_tag else None
136142
137-
138143 # Записываем код статуса и SEO-данные в базу данных
139-
140144 cur .execute ('''
141145 INSERT INTO url_checks (url_id, status_code, h1, title, description)
142146 VALUES (%s, %s, %s, %s, %s)
143- ''' , (url_id , response .status_code , h1_content , title_content , description_content ))
147+ ''' , (url_id , response .status_code , h1_content , title_content , description_content ))
148+
144149 conn .commit ()
145- flash ('Страница успешно проверена' )
146- except requests .exceptions .RequestException :
147- flash ('Произошла ошибка при проверке.' )
150+ flash ('Страница успешно проверена' , 'success' )
151+ except Exception as e :
152+ conn .rollback ()
153+ flash ('Произошла ошибка при проверке' , 'error' )
148154 finally :
149155 cur .close ()
150156 conn .close ()
151157
152158 return redirect (url_for ('url_detail' , url_id = url_id ))
153159
154160
161+
162+
155163if __name__ == '__main__' :
156164 app .run (debug = True )
157165
0 commit comments