@@ -23,85 +23,104 @@ def get_db_connection():
2323def index ():
2424 if request .method == 'POST' :
2525 url = request .form ['url' ]
26- if not validators .url (url ) or len (url ) > 255 :
27- flash ('Некорректный URL' , 'error' )
28- return redirect (url_for ('index' ))
29-
30- # Извлекаем домен из URL
31- domain = urlparse (url ).netloc
32-
33- conn = get_db_connection ()
34- cur = conn .cursor ()
35- try :
36- # Проверяем, существует ли уже этот домен
37- cur .execute ('SELECT id FROM urls WHERE name = %s' , (domain ,))
38- existing_url = cur .fetchone ()
39-
40- if existing_url :
41- # Если домен уже существует, перенаправляем на его детали
42- url_id = existing_url [0 ]
43- flash ('Страница уже существует' , 'error' )
44- return redirect (url_for ('url_detail' , url_id = url_id ))
45-
46- # Если домен не существует, добавляем его
47- cur .execute ('INSERT INTO urls (name) VALUES (%s) RETURNING id' , (domain ,))
48- url_id = cur .fetchone ()[0 ]
49- conn .commit ()
50- flash ('Страница успешно добавлена' , 'success' )
51-
52- return redirect (url_for ('url_detail' , url_id = url_id ))
53- except Exception as e :
54- conn .rollback ()
55- flash (f'Произошла ошибка: { str (e )} ' , 'error' )
56- finally :
57- cur .close ()
58- conn .close ()
59-
26+ return redirect (url_for ('urls' , url = url ))
6027 return render_template ('index.html' )
6128
62-
63- @app .route ('/urls' , methods = ['GET' ])
29+ @app .route ('/urls' , methods = ['GET' , 'POST' ])
6430def urls ():
65- conn = get_db_connection ()
66- cur = conn .cursor ()
31+ if request .method == 'POST' :
32+ url = request .form ['url' ]
33+ if not validators .url (url ) or len (url ) > 255 :
34+ flash ('Некорректный URL' , 'error' )
35+ return render_template ('index.html' ), 422 # Возвращаем ошибку 422 с HTML
6736
68- # Объединяем запросы для получения всех URL и последней проверки
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- ORDER BY u.created_at DESC
81- ''' )
82- urls = cur .fetchall ()
83-
84- cur .close ()
85- conn .close ()
37+ domain = urlparse (url ).netloc
8638
87- return render_template ('urls.html' , urls = urls )
39+ with get_db_connection () as conn :
40+ with conn .cursor () as cur :
41+ try :
42+ cur .execute ('SELECT id FROM urls WHERE name = %s' , (domain ,))
43+ existing_url = cur .fetchone ()
44+
45+ if existing_url :
46+ url_id = existing_url [0 ]
47+ flash ('Страница уже существует' , 'error' )
48+ return redirect (url_for ('url_detail' , url_id = url_id ))
49+
50+ cur .execute ('INSERT INTO urls (name) VALUES (%s) RETURNING id' , (domain ,))
51+ url_id = cur .fetchone ()[0 ]
52+ conn .commit ()
53+ flash ('Страница успешно добавлена' , 'success' )
54+
55+ return redirect (url_for ('url_detail' , url_id = url_id ))
56+ except Exception as e :
57+ conn .rollback ()
58+ flash (f'Произошла ошибка: { str (e )} ' , 'error' )
59+
60+ else :
61+ url = request .args .get ('url' )
62+ if url :
63+ if not validators .url (url ) or len (url ) > 255 :
64+ flash ('Некорректный URL' , 'error' )
65+ return render_template ('index.html' ), 422 # Возвращаем ошибку 422 с HTML
66+
67+ domain = urlparse (url ).netloc
68+
69+ with get_db_connection () as conn :
70+ with conn .cursor () as cur :
71+ try :
72+ cur .execute ('SELECT id FROM urls WHERE name = %s' , (domain ,))
73+ existing_url = cur .fetchone ()
74+
75+ if existing_url :
76+ url_id = existing_url [0 ]
77+ flash ('Страница уже существует' , 'error' )
78+ return redirect (url_for ('url_detail' , url_id = url_id ))
79+
80+ cur .execute ('INSERT INTO urls (name) VALUES (%s) RETURNING id' , (domain ,))
81+ url_id = cur .fetchone ()[0 ]
82+ conn .commit ()
83+ flash ('Страница успешно добавлена' , 'success' )
84+
85+ return redirect (url_for ('url_detail' , url_id = url_id ))
86+ except Exception as e :
87+ conn .rollback ()
88+ flash (f'Произошла ошибка: { str (e )} ' , 'error' )
89+
90+ with get_db_connection () as conn :
91+ with conn .cursor () as cur :
92+ cur .execute ('''
93+ SELECT u.id, u.name, u.created_at,
94+ uc.status_code, uc.created_at AS last_check,
95+ uc.h1, uc.title, uc.description
96+ FROM urls u
97+ LEFT JOIN url_checks uc ON u.id = uc.url_id
98+ AND uc.created_at = (
99+ SELECT MAX(created_at)
100+ FROM url_checks
101+ WHERE url_id = u.id
102+ )
103+ ''' )
104+ urls = cur .fetchall ()
105+ return render_template ('urls.html' , urls = urls )
88106
89107
90108@app .route ('/urls/<int:url_id>' , methods = ['GET' ])
91109def url_detail (url_id ):
92110 conn = get_db_connection ()
93111 cursor = conn .cursor ()
94112 cursor .execute ('SELECT * FROM urls WHERE id = %s' , (url_id ,))
95- url = cursor .fetchone ()
96- cursor .execute ('SELECT * FROM url_checks WHERE url_id = %s' , (url_id ,))
113+ url_record = cursor .fetchone ()
114+ cursor .execute ('SELECT * FROM url_checks WHERE url_id = %s ORDER BY created_at DESC ' , (url_id ,))
97115 checks = cursor .fetchall ()
98116 cursor .close ()
99117 conn .close ()
100- if url is None :
118+
119+ if url_record is None :
101120 flash ('Сайт не найден.' , 'error' )
102121 return redirect (url_for ('urls' ))
103- return render_template ('result.html' , url = url , checks = checks )
104122
123+ return render_template ('result.html' , url = url_record , checks = checks )
105124
106125
107126@app .route ('/check_url/<int:url_id>' , methods = ['POST' ])
@@ -110,13 +129,13 @@ def add_check(url_id):
110129 cur = conn .cursor ()
111130
112131 cur .execute ('SELECT name FROM urls WHERE id = %s' , (url_id ,))
113- url = cur .fetchone ()
132+ url_row = cur .fetchone ()
114133
115- if url is None :
134+ if url_row is None :
116135 flash ('URL не найден.' , 'error' )
117136 return redirect (url_for ('urls' ))
118137
119- url_name = url [0 ]
138+ url_name = url_row [0 ]
120139
121140 # Проверка и добавление схемы к URL, если она отсутствует
122141 parsed_url = urlparse (url_name )
@@ -140,10 +159,13 @@ def add_check(url_id):
140159 description_content = description_tag ['content' ] if description_tag else None
141160
142161 # Записываем код статуса и SEO-данные в базу данных
143- cur .execute ('''
162+ cur .execute (
163+ '''
144164 INSERT INTO url_checks (url_id, status_code, h1, title, description)
145165 VALUES (%s, %s, %s, %s, %s)
146- ''' , (url_id , response .status_code , h1_content , title_content , description_content ))
166+ ''' ,
167+ (url_id , response .status_code , h1_content , title_content , description_content )
168+ )
147169
148170 conn .commit ()
149171 flash ('Страница успешно проверена' , 'success' )
@@ -157,8 +179,5 @@ def add_check(url_id):
157179 return redirect (url_for ('url_detail' , url_id = url_id ))
158180
159181
160-
161-
162182if __name__ == '__main__' :
163- app .run (debug = True )
164-
183+ app .run (debug = True )
0 commit comments