{"id":359558,"date":"2024-05-21T00:35:02","date_gmt":"2024-05-21T00:35:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=359558"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=359558","title":{"rendered":"<span>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 task manager \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a Flask \u0438 psycopg2<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/543\/fbe\/ab5\/543fbeab504f499fe5d66fd61cfdb1a7.png\" width=\"1440\" height=\"760\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/543\/fbe\/ab5\/543fbeab504f499fe5d66fd61cfdb1a7.png\"\/><\/figure>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>\u041d\u0430\u00a0\u0441\u0432\u044f\u0437\u0438 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a <a href=\"https:\/\/newtechaudit.ru\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 NTA<\/a> \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u0420\u0443\u043b\u0435\u0432.<\/p>\n<p>\u042d\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0441\u0442 \u0432\u00a0\u0441\u0435\u0440\u0438\u0438, \u0433\u0434\u0435 \u044f \u0431\u0443\u0434\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c, \u043a\u0430\u043a\u00a0\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 <a href=\"https:\/\/xn--80aidjgwzd.xn--p1ai\/news\/task_manager_kak_vybrat_i_rabotat\/\" rel=\"noopener noreferrer nofollow\">task manager<\/a>. \u0412\u00a0\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f\u00a0\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438, \u043e\u0442\u00a0\u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b \u0438 Excel\u2011\u0442\u0430\u0431\u043b\u0438\u0446 \u0434\u043e\u00a0\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c. \u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u00a0\u2014 \u043f\u0438\u0441\u044c\u043c\u0430 \u0438 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0438, \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u044f\u0435\u0442 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0437\u0430\u0434\u0430\u0447, \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u043e\u0431\u0449\u0443\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u044e \u0440\u0430\u0431\u043e\u0442. \u0412\u0442\u043e\u0440\u043e\u0439\u00a0\u2014 \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0438\u043c\u0435\u0435\u0442 \u043a\u0430\u043a\u00a0\u043f\u043b\u044e\u0441\u044b, \u0442\u0430\u043a \u0438 \u043c\u0438\u043d\u0443\u0441\u044b. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0441\u0438\u043b\u044c\u043d\u044b\u0435 \u0438 \u0441\u043b\u0430\u0431\u044b\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043d\u0430\u00a0\u0440\u044b\u043d\u043a\u0435 task\u2011\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u044b <a href=\"https:\/\/weeek.net\/ru\/blog\/luchshie-task-menedzhery\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u00a0\u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0434\u0430\u0441\u0442 \u043c\u043d\u0435:<\/p>\n<ol>\n<li>\n<p><em>\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438. <\/em><\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0432\u0435\u0441\u0442\u0438 \u0432\u0441\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u00a0\u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0447\u0442\u043e\u00a0\u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442 \u0438\u0445 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435, \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430\u043c\u0438. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043c\u043e\u0436\u0435\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u0441\u0432\u043e\u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0441\u0442\u0430\u0442\u0443\u0441.<\/p>\n<\/li>\n<li>\n<p><em>\u0410\u043d\u0430\u043b\u0438\u0437 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. <\/em><\/p>\n<p>\u041f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0437\u0430\u0434\u0430\u0447, \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u043c \u043d\u0430\u00a0\u043a\u0430\u0436\u0434\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443, \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0422\u0430\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b, \u0432\u044b\u044f\u0432\u043b\u044f\u0442\u044c \u0443\u0437\u043a\u0438\u0435 \u043c\u0435\u0441\u0442\u0430 \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043c\u0435\u0440\u044b \u0434\u043b\u044f\u00a0\u0438\u0445 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ol>\n<details class=\"spoiler\">\n<summary>\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u043f\u043e \u043f\u043e\u0441\u0442\u0443<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p><a href=\"#%D0%B2%D1%8B%D0%B1%D0%BE%D1%80\" rel=\"noopener noreferrer nofollow\">\u0412\u044b\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u00ab\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f\u00bb<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%BF%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D1%8C\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u00ab\u041f\u0440\u043e\u0444\u0438\u043b\u044c\u00bb<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u00ab\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438\u00bb<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0437\u0430\u0434\u0430\u0447<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%B4%D0%BE%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%B7%D0%B0%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<h2>\u0412\u044b\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/h2>\n<p><a class=\"anchor\" name=\"%D0%B2%D1%8B%D0%B1%D0%BE%D1%80\" id=\"\u0432\u044b\u0431\u043e\u0440\"><\/a><\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a\u0438\u0435 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438 \u0441\u0442\u043e\u0438\u0442 \u0443\u0447\u0435\u0441\u0442\u044c:<\/p>\n<p><em>1.\u00a0\u0418\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/em><\/p>\n<p>\u041d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439, \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0443\u0440\u043e\u0432\u043d\u044f \u0437\u043d\u0430\u043d\u0438\u0439.\u00a0\u00a0 <\/p>\n<p><em>2.\u00a0\u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438.<\/em><\/p>\n<p>\u0422\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u0443\u0442\u0451\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0441 \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438. <\/p>\n<p>\u041e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u044e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430:<\/p>\n<ul>\n<li>\n<p>\u043f\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0432 Jupyter Notebook;<\/p>\n<\/li>\n<li>\n<p>web-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u043b\u0430 \u0438\u0434\u0435\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 Jupyter Notebook \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 ipywidgets, \u043d\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0430 \u0438\u043c\u0435\u044e\u0449\u0435\u0439\u0441\u044f \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u0437\u0430\u0434\u0443\u043c\u0430\u043d\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u0442\u043e \u0444\u043e\u043a\u0443\u0441 \u0441\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u0430\u0439\u0442\u0430. <\/p>\n<p>\u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441\u0430\u0439\u0442 \u043b\u0435\u0433\u0447\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0447\u0435\u043c Jupyter Notebook, \u0430 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0434\u0438\u0437\u0430\u0439\u043d \u0438 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0430 \u0437\u0430\u0434\u0430\u0447\u043d\u0438\u043a\u0430, \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0422\u0430\u043a \u043a\u0430\u043a\u00a0\u0443\u00a0\u0432\u0441\u0435\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d python, \u0442\u043e \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u0442\u0438\u0441\u044c \u043d\u0430\u00a0\u043d\u0451\u043c. \u041d\u0430\u00a0\u0441\u0442\u0430\u0440\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0443\u0434\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<ul>\n<li>\n<p><strong>Flask\u00a0\u2014 <\/strong>\u043b\u0435\u0433\u043a\u0438\u0439 \u0438 \u0433\u0438\u0431\u043a\u0438\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0435\u0431\u2011\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p><strong>Flask\u2011WTF\u00a0\u2014 <\/strong>\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 Flask, \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 WTForms, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u043e\u0440\u043c \u0432\u00a0\u0432\u0435\u0431\u2011\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438; <\/p>\n<\/li>\n<li>\n<p><strong>Psycopg2\u00a0\u2014 <\/strong>\u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 PostgreSQL \u0434\u043b\u044f\u00a0Python, \u0442.\u043a. \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e Greenplum;<\/p>\n<\/li>\n<li>\n<p><strong>Pandas \u2014<\/strong> \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f\u00a0\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0445\u0432\u0430\u0442\u0438\u0442. <\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u00ab\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f\u00bb<\/h2>\n<p><a class=\"anchor\" name=\"%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F\" id=\"\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f\"><\/a><\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<pre><code class=\"python\">$ pip install flask        $ pip install flask-wtf $ pip install pandas $ pip install psycopg2<\/code><\/pre>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0435\u0431\u2011\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u0440\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u00a0PyCharm&#8217;\u0435 \u0438 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430\u00a0\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/daf\/86b\/809\/daf86b809131950510ee9fb21f0d7ca1.png\" width=\"289\" height=\"101\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/daf\/86b\/809\/daf86b809131950510ee9fb21f0d7ca1.png\"\/><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0432 \u0444\u0430\u0439\u043b\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 __init__.py<\/em><\/p>\n<pre><code class=\"python\">from flask import Flask app = Flask(name) from app import routes<\/code><\/pre>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 routes.py<\/em><\/p>\n<pre><code class=\"python\">from app import app  @app.route('\/') @app.route('\/index') def login():     return ('Hello, World!')<\/code><\/pre>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0447\u0442\u043e\u00a0\u0436\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b @app.route. \u0412\u00a0\u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 URL\u2011\u0430\u0434\u0440\u0435\u0441\u043e\u043c, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430, \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0438\u0436\u0435. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u043e\u0433\u0434\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u00ab\/\u00bb \u0438\u043b\u0438 \u00ab\/index\u00bb, Flask \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0438\u0436\u0435 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0441\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432\u00a0\u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 startup.py<\/em><\/p>\n<pre><code class=\"python\">from app import app   if __name__ == '__main__':     app.run()<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0449\u0443 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0443 \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/31c\/100\/308\/31c1003088c790d2dbcde01da39d1a81.png\" width=\"334\" height=\"144\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/31c\/100\/308\/31c1003088c790d2dbcde01da39d1a81.png\"\/><\/figure>\n<p>\u0421\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u0434\u043d\u044f\u043b\u0441\u044f, \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u043c \u0444\u043e\u0440\u043c\u0443 \u0434\u043b\u044f\u00a0\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0438\u00a0\u0431\u044b\u043b\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"https:\/\/flask-wtf.readthedocs.io\/en\/1.2.x\/\" rel=\"noopener noreferrer nofollow\">Flask\u2011WTF<\/a>. <\/p>\n<p>\u0412\u00a0\u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u0441\u044f \u043e\u00a0\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u043d\u043e\u00a0\u0432\u0441\u0451\u00a0\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043c config \u0432\u00a0\u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044e __init__.py<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 config.py<\/em><\/p>\n<pre><code class=\"python\">import os  class Config(object):     SECRET_KEY = os.environ.get('SECRET_KEY') or 'never-gonna-give-you-up'<\/code><\/pre>\n<p>Flask \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u044e\u0447\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0435\u0439 \u0438 \u0442\u043e\u043a\u0435\u043d\u043e\u0432. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 Flask-WTF \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u0437\u0430\u0449\u0438\u0442\u044b \u0432\u0435\u0431-\u0444\u043e\u0440\u043c\u044b \u043e\u0442 \u0430\u0442\u0430\u043a\u0438 Cross-Site Request Forgery (\u043f\u043e\u0434\u0434\u0435\u043b\u043a\u0430 \u043c\u0435\u0436\u0441\u0430\u0439\u0442\u043e\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432).<\/p>\n<p><strong>\u0412\u0430\u0436\u043d\u043e:<\/strong> \u043f\u0440\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438 \u0442\u0440\u0443\u0434\u043d\u043e \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0421\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439 \u043a\u0440\u0443\u0433 \u043b\u0438\u0446, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u044e\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435!<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 __init__.py<\/em><\/p>\n<pre><code class=\"python\">from flask import Flask from config import Config  app = Flask(__name__) app.config.from_object(Config)  from app import routes<\/code><\/pre>\n<p>\u041c\u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 forms.py<\/em><\/p>\n<pre><code class=\"python\">from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField  from wtforms.validators import DataRequired  class LoginForm(FlaskForm):     username = StringField('Username', validators=[DataRequired()])     password = PasswordField('Password', validators=[DataRequired()])     submit = SubmitField('\u0412\u043e\u0439\u0442\u0438')<\/code><\/pre>\n<ul>\n<li>\n<p><strong>StringField<\/strong> \u2013 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430, \u0432 HTML \u0440\u0430\u0432\u043d\u043e \u0442\u0435\u0433\u0443 &lt;input type=\u201dtext\u201d>;<\/p>\n<\/li>\n<li>\n<p><strong>PasswordField<\/strong> \u2013 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f, \u0432 HTML \u0440\u0430\u0432\u043d\u043e \u0442\u0435\u0433\u0443 &lt;input type=\u201dpassword\u201d>;<\/p>\n<\/li>\n<li>\n<p><strong>SubmitField \u2013 <\/strong>\u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0444\u043e\u0440\u043c\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u0432 HTML \u0440\u0430\u0432\u043d\u043e \u0442\u0435\u0433\u0443 &lt;input type=\u201dsubmit\u201d>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c html \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0443, \u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435.<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 index.html<\/em><\/p>\n<pre><code class=\"xml\">&lt;!DOCTYPE html> &lt;html lang=\"ru\"> &lt;head>     &lt;meta charset=\"UTF-8\">     &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">     &lt;link rel=\"stylesheet\" type=\"text\/css\" href=\"{{ url_for( 'static', filename='my_style.css' )}}\">     &lt;link rel=\"stylesheet\" type=\"text\/css\" href=\"{{ url_for( 'static', filename='style.css' )}}\">     &lt;title>\u0417\u0430\u0434\u0430\u0447\u043d\u0438\u043a \u041e\u0410\u0420\u0411 - \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f&lt;\/title> &lt;\/head> &lt;style> &lt;\/style> &lt;body>     &lt;div class=\"authorization position-absolute top-50 start-50 translate-middle\">         &lt;div class=\"position-absolute top-50 start-50 translate-middle\">             &lt;h1>\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f&lt;\/h1>&lt;br>             &lt;form action=\"\" method=\"post\" novalidate>                 {{ form.hidden_tag() }}                 &lt;p>                     {{ form.username(size=32, placeholder=\"login\") }}&lt;br>                     {% for error in form.username.errors %}                     &lt;span style=\"color: red;\">[{{ error }}]&lt;\/span>                     {% endfor %}                 &lt;\/p>                 &lt;p>                     {{ form.password(size=32, placeholder=\"password\") }}&lt;br>                     {% for error in form.password.errors %}                     &lt;span style=\"color: red;\">[{{ error }}]&lt;\/span>                     {% endfor %}                 &lt;\/p>                 &lt;p style=\"color: red\">{{ form.error_connect.label }}&lt;\/p>                 &lt;p>{{ form.submit() }}&lt;\/p>             &lt;\/form>         &lt;\/div>     &lt;\/div> &lt;\/body> &lt;\/html> <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0444\u0430\u0439\u043b routes \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 routes.py<\/em><\/p>\n<pre><code class=\"python\">from flask import render_template, redirect   from app import app from app.forms import LoginForm  @app.route('\/') @app.route('\/index') def login():     form = LoginForm()     return render_template('index.html', form=form)<\/code><\/pre>\n<p>\u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/922\/0b7\/994\/9220b7994055a2be3b891f831c340e68.png\" width=\"332\" height=\"263\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/922\/0b7\/994\/9220b7994055a2be3b891f831c340e68.png\"\/><\/figure>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u00ab\u041f\u0440\u043e\u0444\u0438\u043b\u044c\u00bb<\/h2>\n<p><a class=\"anchor\" name=\"%D0%BF%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D1%8C\" id=\"\u043f\u0440\u043e\u0444\u0438\u043b\u044c\"><\/a><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u044f \u0441\u0432\u0435\u0440\u0441\u0442\u0430\u043b \u0444\u043e\u0440\u043c\u0443, \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u00a0\u0411\u0414. \u0414\u043b\u044f\u00a0\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 psycopg2, \u0430\u00a0\u0434\u043b\u044f\u00a0\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u044c\u043c\u0443 pandas. <\/p>\n<p>\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<pre><code class=\"python\">import pandas as pd import psycopg2 as pg<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u043c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0411\u0414:<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 routes.py<\/em><\/p>\n<pre><code class=\"python\"># \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0411\u0414 Greenplum def get_db_connection(user, password):     try:         # \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f         global user_login         global user_password         user_login = user         user_password = password          # \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f         conn_param = f'host=server.ru port=1234 dbname=mydb user={user} password={password}'                  # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0430\u0432\u0442\u043e\u043a\u043e\u043c\u0438\u0442         conn = pg.connect(conn_param)         conn.autocommit = True          return conn     except pg.OperationalError: # \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435         print(\"EGOOOOOOOOOOOOOOOOOOOR:\", pg.OperationalError)         return 0<\/code><\/pre>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u044e \u043c\u0435\u0442\u043e\u0434 login:<\/p>\n<pre><code class=\"python\">@app.route('\/', methods=['GET', 'POST']) @app.route('\/index', methods=['GET', 'POST']) def login():     # \u0421\u043e\u0437\u0434\u0430\u043c \u0444\u043e\u0440\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438     form = LoginForm()     # \u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0443     if form.validate_on_submit(): # \u0421\u043e\u0437\u0434\u0430\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435         global conn  # form.username.data \u2013 \u043b\u043e\u0433\u0438\u043d \u0441 \u0444\u043e\u0440\u043c\u044b # form.password.data \u2013 \u043f\u0430\u0440\u043e\u043b\u044c \u0441 \u0444\u043e\u0440\u043c\u044b         conn = get_db_connection(str(form.username.data), str(form.password.data))  # \u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043e         if conn:             return redirect('\/main')     return render_template('index.html', form=form) <\/code><\/pre>\n<p>\u0427\u0443\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u044e\u0441\u044c \u043d\u0430\u00a0\u044d\u0442\u043e\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0435.<\/p>\n<p>\u0412\u00a0\u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <em>methods. <\/em>\u042d\u0442\u0438\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u044f \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e, \u0447\u0442\u043e\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b GET \u0438 POST (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e GET \u0437\u0430\u043f\u0440\u043e\u0441\u044b). <\/p>\n<p><em>GET\u2011\u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/em>\u00a0\u2014 \u044d\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043a\u043b\u0438\u0435\u043d\u0442\u0443 (\u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u00a0\u2014 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0432\u00a0\u0432\u0435\u0431\u2011\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435).<\/p>\n<p><em>POST\u2011\u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/em>\u00a0\u2014 \u044d\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u0438\u00a0\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c \u0444\u043e\u0440\u043c\u044b \u043d\u0430\u00a0\u0441\u0435\u0440\u0432\u0435\u0440 (\u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u00a0\u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u043b\u043e\u0433\u0438\u043d\u0430 \u0438 \u043f\u0430\u0440\u043e\u043b\u044f). <\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u044e \u043c\u0435\u0442\u043e\u0434 <em>form.validate_on_submit()<\/em>. \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0444\u043e\u0440\u043c\u044b (POST\u2011\u0437\u0430\u043f\u0440\u043e\u0441). \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430\u00a0\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f GET\u2011\u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <em>False<\/em>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f if \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u0438\u0434\u0438\u0442 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 POST\u2011\u0437\u0430\u043f\u0440\u043e\u0441 (\u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 submit), \u043c\u0435\u0442\u043e\u0434 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u00a0\u0444\u043e\u0440\u043c\u044b, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u0435\u0439, \u0438 \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <em>True<\/em>.<\/p>\n<p>\u041f\u0440\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u00ab\u041f\u0440\u043e\u0444\u0438\u043b\u044c\u00bb, \u043d\u0430\u00a0\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043d\u043e\u00a0\u0434\u043b\u044f\u00a0\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043c \u0448\u0430\u0431\u043b\u043e\u043d, \u043f\u043e\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0443\u0434\u0443\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0438. <\/p>\n<p>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 Jinja2\u00a0\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u00a0\u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435 \u0441\u00a0Flask. Jinja2\u00a0\u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0431\u043b\u043e\u043a\u0438 {{\u2026}} \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u00a0\u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <em>render_template()<\/em>.<\/p>\n<p><em>\u0414\u043b\u044f \u0447\u0435\u0433\u043e \u0436\u0435 \u043d\u0443\u0436\u0435\u043d <\/em>\u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440<em>?<\/em><\/p>\n<p><em>1.\u00a0\u0421\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043b\u0438\u0448\u043d\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b.<\/em><\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0443\u044e\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 (\u0422\u0435\u0433 head \u0438 header), \u043d\u0430\u043f\u0438\u0448\u0443 \u0435\u0451 \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. <\/p>\n<p><em>2.\u00a0\u0423\u0434\u043e\u0431\u043d\u0430\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a\u0430.<\/em><\/p>\n<p>\u0415\u0441\u043b\u0438 \u044f \u0440\u0435\u0448\u0443 \u0432\u043d\u0435\u0441\u0442\u0438 \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u043b\u0438 \u0441\u0442\u0438\u043b\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438).<\/p>\n<p><em>3.\u00a0\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438 \u0434\u0438\u0437\u0430\u0439\u043d\u0430.<\/em><\/p>\n<p>\u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0430\u043a\u0435\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u0441\u0430\u0439\u0442\u0430 \u0438 \u0435\u0433\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0439. \u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u0435\u0441\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u043f\u0430\u0440\u0435 \u00ab\u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u00bb.<\/p>\n<p>\u0421 \u043f\u043b\u044e\u0441\u0430\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0441\u044f, \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u043c \u0444\u0430\u0439\u043b base.html, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 base.html<\/em><\/p>\n<pre><code class=\"xml\">&lt;!DOCTYPE html> &lt;html lang=\"ru\"> &lt;head>     &lt;meta charset=\"UTF-8\">     &lt;link rel=\"stylesheet\" type=\"text\/css\" href=\"{{ url_for( 'static', filename='my_style.css' )}}\">     &lt;title>\u0417\u0430\u0434\u0430\u0447\u043d\u0438\u043a  - {% block title %}{% endblock %}&lt;\/title> &lt;\/head> &lt;header>     &lt;ul class=\"nav nav-pills nav-fill\">         &lt;li class=\"nav-item\">             &lt;a class=\"nav-link\" href=\"\/main\">\u041f\u0440\u043e\u0444\u0438\u043b\u044c&lt;\/a>         &lt;\/li>         &lt;li class=\"nav-item\">             &lt;a class=\"nav-link\" href=\"\/create_task\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438&lt;\/a>         &lt;\/li>         &lt;li class=\"nav-item\">             &lt;a class=\"nav-link\" href=\"\/select_task_for_me\">\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0437\u0430\u0434\u0430\u0447 \u0434\u043b\u044f \u043c\u0435\u043d\u044f&lt;\/a>         &lt;\/li>         &lt;li>             &lt;a class=\"nav-link\" href=\"\/select_task_from_me\">\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0437\u0430\u0434\u0430\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u043b \u044f&lt;\/a>         &lt;\/li>     &lt;\/ul> &lt;\/header> &lt;body>     {% block content_h1 %}{% endblock %}     &lt;hr>     {% block content %}{% endblock %}     &lt;hr> &lt;\/body> &lt;\/html> <\/code><\/pre>\n<p><code>{% block \u2026 %} {% endblock %}<\/code> \u2013 \u0448\u0430\u0431\u043b\u043e\u043d, \u043a\u0443\u0434\u0430 \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u043d\u0442.<\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0441\u0442\u043e\u0438\u0442 \u0443\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e css \u0444\u0430\u0439\u043b\u0430 (\u0431\u043b\u043e\u043a &lt;link>).<\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0432\u0435\u0440 \u043c\u043e\u0433 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c css \u0431\u044b\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 .<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bd5\/caa\/93b\/bd5caa93bd198998dc2495f6e92a5ebf.png\" width=\"186\" height=\"60\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bd5\/caa\/93b\/bd5caa93bd198998dc2495f6e92a5ebf.png\"\/><\/figure>\n<p>\u0424\u0430\u0439\u043b my_style.css \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0443\u044e \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0443 bootstrap. Bootstrap \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f \u043c\u043d\u0435 \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0442\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0440\u0438\u00a0\u0440\u0430\u0437\u043d\u043e\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u044d\u043a\u0440\u0430\u043d\u0430.<\/p>\n<p> \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u00ab\u041f\u0440\u043e\u0444\u0438\u043b\u044c\u00bb \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 main.html<\/em><\/p>\n<pre><code class=\"xml\">{% extends \"base.html\" %}  {% block title %}\u041f\u0440\u043e\u0444\u0438\u043b\u044c{% endblock %}  {% block content_h1 %} &lt;h1 style=\"text-align:center\">\u041f\u0440\u043e\u0444\u0438\u043b\u044c&lt;\/h1> {% endblock %}  {% block content %}     &lt;p>&lt;b>login:&lt;\/b> {{selected.iloc[0]['user_id']}} &lt;\/p>     &lt;p>&lt;b>\u0424\u0418\u041e:&lt;\/b> {{selected.iloc[0]['login']}} &lt;\/p>     &lt;p>&lt;b>email:&lt;\/b> {{selected.iloc[0]['email']}} &lt;\/p> {% endblock %}<\/code><\/pre>\n<p><code>{% extends \u00abbase.html\u00bb%}<\/code>\u00a0\u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430.<\/p>\n<p><code>{% block \u2026%} {% endblock%}<\/code>\u00a0\u2014 \u0432\u0441\u0435 \u0442\u0435\u0433\u0438, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u044f\u0442\u0441\u044f \u0432\u00a0\u0448\u0430\u0431\u043b\u043e\u043d.<\/p>\n<p>{{ \u2026 }}\u00a0\u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0412\u00a0\u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044f \u043f\u0435\u0440\u0435\u0434\u0430\u044e Data Frame <strong>selected<\/strong>. <\/p>\n<p>\u041d\u043e\u00a0\u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0444\u0438\u043b\u044f?\u00a0\u2014 \u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0441\u00a0\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u043a\u00a0\u0411\u0414. \u0412\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a:<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 routes.py<\/em><\/p>\n<pre><code class=\"python\"># \u0412\u044b\u0431\u043e\u0440\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435 def select_profile(connect,created_user):     global user_login     SQL=f'''select *         from tm_schema.task_manager_user         where user_id={user_login}         '''.format(created_user)     return pd.read_sql_query(SQL, connect)<\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c route(\u2018\/main\u2019). <\/p>\n<pre><code class=\"python\">app.route('\/main') def main():     global conn     selected = select_profile(conn, 1)     return render_template('main.html', selected=selected)<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u044e \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u0440\u043e\u0444\u0438\u043b\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f1b\/f86\/01a\/f1bf8601a42bdf3b9e0c5b2c31f19025.png\" width=\"974\" height=\"123\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f1b\/f86\/01a\/f1bf8601a42bdf3b9e0c5b2c31f19025.png\"\/><\/figure>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u00ab\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438\u00bb<\/h2>\n<p><a class=\"anchor\" name=\"%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8\" id=\"\u0437\u0430\u0434\u0430\u0447\u0438\"><\/a><\/p>\n<p>\u041f\u043e\u00a0\u0445\u043e\u0434\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f task manager \u0443\u00a0\u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0411\u041a \u0438 \u043f\u043e\u0434\u0442\u044f\u043d\u0443\u0442\u044c \u0438\u0437\u00a0\u043d\u0435\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435. \u041f\u0440\u0438\u043c\u0435\u043d\u044e \u044d\u0442\u043e\u0442 \u043e\u043f\u044b\u0442 \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u00a0\u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430\u0445, \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0441\u043f\u0440\u0438\u043d\u0442\u0430\u0445 \u0438 \u0442\u0438\u043f\u0430\u0445 \u0437\u0430\u0434\u0430\u0447. \u041a\u0430\u043a\u00a0\u0438\u0442\u043e\u0433 \u043f\u043e\u043b\u0443\u0447\u0443 \u0448\u0430\u0431\u043b\u043e\u043d:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/765\/643\/748\/765643748fc4b095cccd0173ee335a0a.png\" width=\"556\" height=\"530\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/765\/643\/748\/765643748fc4b095cccd0173ee335a0a.png\"\/><\/figure>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0440\u0438 \u043d\u043e\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446.<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 routes.py<\/em><\/p>\n<pre><code class=\"python\"># \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 def select_users(connect, created_user):     SQL = f'''select *         from tm_schema.task_manager_user         '''.format(created_user)     return pd.read_sql_query(SQL, connect)  # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043f\u0440\u0438\u043d\u0442\u043e\u0432 def select_checks(connect, created_user):     SQL = f'''select *         from tm_schema.task_manager_check         '''.format(created_user)     return pd.read_sql_query(SQL, connect)  # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 \u0437\u0430\u0434\u0430\u0447 def select_task_types(connect, created_user):     global user_login     SQL = f'''select *         from tm_schema.task_manager_dic_task_type         '''.format(created_user)     return pd.read_sql_query(SQL, connect)<\/code><\/pre>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u043e\u0440\u043c\u044b \u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438.<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 forms.py<\/em><\/p>\n<pre><code class=\"python\">class Create_task(FlaskForm):     task_name = StringField('\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438:', validators=[DataRequired()])     task_created_date = DateTimeField('\u0414\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f:', format='%d-%m-%Y %H:%M')     task_in_check = StringField(\"\u0421\u043f\u0440\u0438\u043d\u0442:\")     task_created_user = StringField('\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u0441\u043e\u0437\u0434\u0430\u0432\u0448\u0438\u0439 \u0437\u0430\u0434\u0430\u0447\u0443:')     task_update_date = DateTimeField('\u0414\u0430\u0442\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f:', format='%d-%m-%Y %H:%M')     task_update_user = StringField('\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u043e\u0431\u043d\u043e\u0432\u0438\u0432\u0448\u0438\u0439 \u0437\u0430\u0434\u0430\u0447\u0443:')     task_description = TextAreaField('\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438:')     task_control_date = DateTimeField('\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0434\u0430\u0442\u0430:', format='%d-%m-%Y %H:%M')     task_assigned_date = DateTimeField('\u0414\u0430\u0442\u0430 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:', format='%d-%m-%Y %H:%M')     to_user = StringField('\u041a\u043e\u043c\u0443:')      task_priority = SelectField('\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442:', choices=[('\u041d\u0438\u0437\u043a\u0438\u0439', '\u041d\u0438\u0437\u043a\u0438\u0439'), ('\u0421\u0440\u0435\u0434\u043d\u0438\u0439', '\u0421\u0440\u0435\u0434\u043d\u0438\u0439'), ('\u0412\u044b\u0441\u043e\u043a\u0438\u0439', '\u0412\u044b\u0441\u043e\u043a\u0438\u0439')], validate_choice=False, validators=[DataRequired()])     task_type = StringField('\u0422\u0438\u043f \u0437\u0430\u0434\u0430\u0447\u0438:')     task_status = SelectField('\u0421\u0442\u0430\u0442\u0443\u0441:', choices=[('1', '\u041d\u043e\u0432\u0430\u044f'), ('2', '\u0412 \u0440\u0430\u0431\u043e\u0442\u0435'), ('3', '\u041f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430'), ('4', '\u0417\u0430\u043a\u0440\u044b\u0442\u0430')], default<\/code><\/pre>\n<ul>\n<li>\n<p><strong>DateTimeField <\/strong>\u2013<strong> <\/strong>\u043f\u043e\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0432 HTML \u0440\u0430\u0432\u043d\u043e \u0442\u0435\u0433\u0443 &lt;input type=\u201ddatetime-local\u201d>;<\/p>\n<\/li>\n<li>\n<p><strong>TextAreaField <\/strong>\u2013<strong> <\/strong>\u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0432\u043e\u0434\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u0430, \u0432 HTML \u0440\u0430\u0432\u043d\u043e \u0442\u0435\u0433\u0443 &lt;textarea>&lt;\/textarea>;<\/p>\n<\/li>\n<li>\n<p><strong>SelectField <\/strong>\u2013 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0432 HTML \u0440\u0430\u0432\u043d\u043e \u0442\u0435\u0433\u0443 &lt;select >&lt;\/select>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0444\u043e\u0440\u043c\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u044b, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0440\u0430 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a\u00a0\u0444\u0430\u0439\u043b\u0443 routes.py, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 routes.py<\/em><\/p>\n<pre><code class=\"python\">app.route('\/create_task', methods=['GET', 'POST']) def create_task():     conn = get_db_connection(user_login, user_password)     form = Create_task()     select_user = select_users(conn, 1)     select_check = select_checks(conn, 1)     task_type = select_task_types(conn, 1)     selected = select_profile(conn, 1)     conn.close()     if form.validate_on_submit(): . . . .     return render_template('create_task.html', form=form, select_user=select_user,                            select_check=select_check, task_type=task_type)<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0432\u0430\u0436\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0442\u043e\u0438\u0442 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0440\u0441\u0442\u043a\u0430 \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 create_task.html <\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"xml\">{% extends \"base.html\" %}  {% block title %}\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438{% endblock %}  {% block content_h1 %} &lt;h1 style=\"text-align:center\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438&lt;\/h1> {% endblock %}  {% block content %} &lt;form action=\"\" method=\"POST\"       style=\"text-align:center\">     {{ form.hidden_tag() }}     &lt;!-- \u0412\u044b\u0431\u043e\u0440 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0430   -->     &lt;p>         {{ form.to_user.label }}&lt;br>          &lt;input name=\"pers\" type=\"text\" list=\"person\">         &lt;datalist id=\"person\">             {% for i, user in select_user.iterrows() %}                 &lt;option value=\"{{ user['user_id']}}\">{{ user['login'] }}&lt;\/option>             {% endfor %}         &lt;\/datalist>         &lt;br>         {% for error in form.to_user.errors %}             &lt;span style=\"color: red;\">{{ error }}&lt;\/span>         {% endfor %}     &lt;\/p>     &lt;p>         {{ form.task_in_check.label }}         &lt;br>         &lt;input name=\"check\" type=\"text\" list=\"check\">         &lt;datalist id=\"check\">             {% for i, check in select_check.iterrows() %}                 &lt;option value=\"{{ check['km'] }}\">{{ check['name'] }}&lt;\/option>             {% endfor %}         &lt;\/datalist>         &lt;br>         {% for error in form.task_in_check.errors %}             &lt;span style=\"color: red;\">{{ error }}&lt;\/span>         {% endfor %}     &lt;\/p>     &lt;p>         {{ form.task_name.label }}&lt;br>         {{ form.task_name(size=35) }}         &lt;br>         {% for error in form.task_name.errors %}             &lt;span style=\"color: red;\">{{ error }}&lt;\/span>         {% endfor %}     &lt;\/p>     &lt;p>         {{ form.task_description.label }}&lt;br>         {{ form.task_description }}     &lt;\/p>     &lt;p>         {{ form.task_control_date.label }}         &lt;br>         &lt;input name=\"control_date\" type=\"datetime-local\">         &lt;br>         {% for error in form.task_control_date.errors %}             &lt;span style=\"color: red;\">{{ error }}&lt;\/span>         {% endfor %}     &lt;\/p>     &lt;p>         {{ form.task_type.label }}&lt;br>         &lt;input name=\"type_task\" type=\"text\" list=\"type_task\">         &lt;datalist id=\"type_task\">             {% for i, type in task_type.iterrows() %}                 &lt;option value=\"{{ type['name'] }}\">&lt;\/option>             {% endfor %}         &lt;\/datalist>         &lt;br>         {% for error in form.task_type.errors %}             &lt;span style=\"color: red;\">{{ error }}&lt;\/span>         {% endfor %}     &lt;\/p>     &lt;p>         {{ form.task_priority.label }}         {{ form.task_priority(length=35) }}     &lt;\/p>     {{ form.submit() }} &lt;\/form> {% endblock %}<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/778\/c19\/ac1\/778c19ac1516673594d64b2e56a99ac5.png\" width=\"398\" height=\"294\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/778\/c19\/ac1\/778c19ac1516673594d64b2e56a99ac5.png\"\/><\/figure>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 create_task.html<\/em><\/p>\n<pre><code class=\"xml\">&lt;p>         {{ form.to_user.label }}&lt;br>          &lt;input name=\"pers\" type=\"text\" list=\"person\">         &lt;datalist id=\"person\">             {% for i, user in select_user.iterrows() %}                 &lt;option value=\"{{ user['user_id']}}\">{{ user['login'] }}&lt;\/option>             {% endfor %}         &lt;\/datalist>         &lt;br>         {% for error in form.to_user.errors %}             &lt;span style=\"color: red;\">{{ error }}&lt;\/span>         {% endfor %}     &lt;\/p><\/code><\/pre>\n<p>\u0414\u043b\u044f\u00a0\u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0431\u0435\u0440\u0443 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 Data Frame c \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043e\u00a0\u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430\u0445 \u0438 \u0432\u044b\u0431\u0435\u0440\u0443 \u043d\u0443\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e.<\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 (\u0421\u043f\u0440\u0438\u043d\u0442 \u0438 \u0442\u0438\u043f \u0437\u0430\u0434\u0430\u0447\u0438) \u0434\u0435\u043b\u0430\u044e\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u00a0\u0444\u043e\u0440\u043c\u044b \u0438 \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432\u00a0\u0444\u0430\u0439\u043b\u0435 <strong>routes.py.<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 routes.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">if form.validate_on_submit():     # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0433\u0434\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u043b-\u0432\u043e \u043e\u0448\u0438\u0431\u043e\u043a     err_counter = 0     # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445     print('title:\\t' + form.task_name.data)     form.task_created_date.data = datetime.datetime.now()     print(f'created_date:\\t', form.task_created_date.data)      # \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f try-except \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u043b\u044f, \u0430 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u043d\u0435\u0443\u0434\u0430\u0447\u0435.      try: # \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0444\u043e\u0440\u043c\u044b \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0438\u0445 \u0441 \u0442\u0435\u043c\u0438, \u0447\u0442\u043e \u0435\u0441\u0442\u044c         check_temp = select_check[select_check['km'] == request.form[\"check\"]] # \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439, \u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435         form.task_in_check.data = check_temp.iloc[0]['check_id']     except:         err_counter = err_counter + 1         form.task_in_check.errors = ['\u041f\u043e\u043b\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c!']     print('check_id:\\t' + str(form.task_in_check.data))     # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 DataFrame \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 iloc (\u0421\u0440\u0435\u0437 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c)      form.task_created_user.data = selected.iloc[0]['user_id']     print('created_user:\\t' + str(form.task_created_user.data))     # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f      form.task_update_date.data = datetime.datetime.now()     print('update_date:\\t', form.task_update_date.data)     # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 DataFrame \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 iloc (\u0421\u0440\u0435\u0437 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c)     form.task_update_user.data = selected.iloc[0]['user_id']     print('update_user:\\t' + str(form.task_update_user.data))     print('description:\\t' + form.task_description.data)     # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0444\u043e\u0440\u043c\u044b      form.task_control_date.data = request.form['control_date']     # \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0443\u0441\u0442\u0430\u044f, \u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u043c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435     if form.task_control_date.data == '':         err_counter = err_counter + 1         form.task_control_date.errors = ['\u041f\u043e\u043b\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c!']     print('control_date:\\t' + form.task_control_date.data)     # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f     form.task_assigned_date.data = datetime.datetime.now()     print('assigned_date:\\t', form.task_assigned_date.data)     # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0444\u043e\u0440\u043c\u044b     form.to_user.data = request.form['pers']     # \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0443\u0441\u0442\u0430\u044f, \u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u043c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435     if form.to_user.data == '':         err_counter = err_counter + 1         form.to_user.errors = ['\u041f\u043e\u043b\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c!']     print('assigned_user\\t' + str(form.to_user.data))     print('priority:\\t' + form.task_priority.data)     try:         # \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0444\u043e\u0440\u043c\u044b \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0438\u0445 \u0441 \u0442\u0435\u043c\u0438, \u0447\u0442\u043e \u0435\u0441\u0442\u044c         task_type_temp = task_type[task_type['name'] == str(request.form['type_task'])]         # \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439, \u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435         form.task_type.data = task_type_temp.iloc[0]['task_type_id']     except:         err_counter = err_counter + 1         form.task_type.errors = ['\u041f\u043e\u043b\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c!']     print('type:\\t', str(form.task_type.data))     print('status:\\t' + form.task_status.data)      print('Error ---------------------------------', err_counter)     # \u0415\u0441\u043b\u0438 \u043d\u0435 \u0431\u044b\u043b\u043e \u043e\u0448\u0438\u0431\u043e\u043a, \u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443     if err_counter == 0:         conn = get_db_connection(user_login, user_password)         tip = insert_task(conn, 1, form)         print(tip)         conn.close()          return redirect('\/select_task_from_me')<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0417\u0434\u0435\u0441\u044c \u0438\u0434\u0435\u0442 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437\u00a0\u0444\u043e\u0440\u043c\u044b, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u00a0\u043f\u0443\u0441\u0442\u043e\u0442\u0443 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u00a0\u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043d\u0435\u00a0\u0431\u044b\u043b\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u043e\u0448\u0438\u0431\u043e\u043a, \u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430\u00a0\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432\u00a0\u0442\u0430\u0431\u043b\u0438\u0446\u0443.<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 routes.py<\/em><\/p>\n<pre><code class=\"python\">def insert_task(connect, created_user, form):     # task_id ,     try:         SQL = f'''insert into tm_schema.task_manager_task             (title, created_date, check_id, created_user, update_date,              update_user, description, control_date, assigned_date,              assigned_user, priority, type_id, status_id)             values (             '{form.task_name.data}', '{form.task_created_date.data}', '{form.task_in_check.data}',             '{form.task_created_user.data}', '{form.task_update_date.data}', '{form.task_update_user.data}',             '{form.task_description.data}', '{form.task_control_date.data}', '{form.task_assigned_date.data}',             '{form.to_user.data}', '{form.task_priority.data}', '{form.task_type.data}', '{form.task_status.data}'             )         '''.format(created_user)         print(SQL)         res = pd.read_sql_query(SQL, connect)         return res      except Exception as err:          return err<\/code><\/pre>\n<p>\u041d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u044b.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438<\/h4>\n<p>1.\u00a0\u0412\u044b\u0431\u043e\u0440 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f.<\/p>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0444\u0430\u043c\u0438\u043b\u0438\u0438.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/641\/118\/2f8\/6411182f89640cadb3506be3764ddabe.png\" width=\"362\" height=\"209\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/641\/118\/2f8\/6411182f89640cadb3506be3764ddabe.png\"\/><\/figure>\n<p>2.\u00a0\u0412\u044b\u0431\u043e\u0440 \u0441\u043f\u0440\u0438\u043d\u0442\u0430, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0430.<\/p>\n<p>\u041f\u043e\u0438\u0441\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9ac\/440\/996\/9ac44099654df89f75066573983726bb.png\" width=\"180\" height=\"59\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9ac\/440\/996\/9ac44099654df89f75066573983726bb.png\"\/><\/figure>\n<p>3. \u0414\u0430\u043b\u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438.  <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dab\/327\/b5e\/dab327b5e24c3fe0643539ac329b9e08.png\" width=\"478\" height=\"386\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dab\/327\/b5e\/dab327b5e24c3fe0643539ac329b9e08.png\"\/><\/figure>\n<p>4. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0434\u0430\u0442\u044b.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/518\/ceb\/ea4\/518cebea4e06e9843fcc8628adf80926.png\" alt=\"\" title=\"\" width=\"275\" height=\"234\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/518\/ceb\/ea4\/518cebea4e06e9843fcc8628adf80926.png\"\/><\/figure>\n<p>5. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0434\u0430\u0442\u044b \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0442\u0438\u043f \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c34\/eed\/eb0\/c34eedeb06ba0325aa389ef2664633ec.png\" width=\"242\" height=\"355\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c34\/eed\/eb0\/c34eedeb06ba0325aa389ef2664633ec.png\"\/><\/figure>\n<p>6. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u043e\u0440 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430 \u0437\u0430\u0434\u0430\u0447\u0438. <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/292\/180\/387\/29218038765f3511cafba325c07defa1.png\" width=\"194\" height=\"109\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/292\/180\/387\/29218038765f3511cafba325c07defa1.png\"\/><\/figure>\n<p>7. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8df\/30f\/4c8\/8df30f4c81b8c64e2c1277b94c5339c5.png\" width=\"506\" height=\"1038\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8df\/30f\/4c8\/8df30f4c81b8c64e2c1277b94c5339c5.png\"\/><\/figure>\n<p>8. \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0436\u0438\u043c\u0430\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u00ab\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443\u00bb.<\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0437\u0430\u0434\u0430\u0447<\/h2>\n<p><a class=\"anchor\" name=\"%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86\" id=\"\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\"><\/a><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u044d\u0442\u0430\u043f\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u041a\u0430\u043a\u00a0\u0438 \u0432\u00a0\u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0443\u0436\u043d\u044b \u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a\u00a0\u0411\u0414.<\/p>\n<pre><code class=\"python\">def select_task_for_user(connect, created_user):     global user_login     SQL = f'''         select          task.task_id, task.title, task.created_date, create_user.login as created_user, create_user.email as create_user_email,          select_check.\"name\" as check_name, select_check.km as check_km,          task.update_date, update_user.login as update_user, update_user.email as update_user_email,         task.description, task.control_date, task.assigned_date, task.assigned_user,         assigned_user.login as assigned_username,         task.priority, task_type.\"name\" as \"type\", status.\"name\" as \"status\"          from tm_schema.task_manager_task as task         join tm_schema.task_manager_user as create_user         on task.created_user = create_user.user_id         join tm_schema.task_manager_user as update_user         on task.update_user = update_user.user_id         join tm_schema.task_manager_check as select_check          on task.check_id = select_check.check_id          join tm_schema.task_manager_dic_status as status         on task.status_id = status.status_id          join tm_schema.task_manager_dic_task_type as task_type         on task.type_id = task_type.task_type_id          join tm_schema.task_manager_user as assigned_user         on task.assigned_user = assigned_user.user_id         where assigned_user={user_login}     '''.format(created_user)      return pd.read_sql_query(SQL, connect)<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.<\/p>\n<p>1.\u00a0\u041d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u043b (create_user), \u043e\u0431\u043d\u043e\u0432\u0438\u043b (update_user) \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0438 (assigned_user).<\/p>\n<p>2.\u00a0\u041d\u0443\u0436\u043d\u0430 \u043f\u043e\u043b\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u043f\u0440\u0438\u043d\u0442\u0435 (select_check).<\/p>\n<p>3.\u00a0\u0410 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0443\u0437\u043d\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 (status) \u0438 \u0442\u0438\u043f (task_type) \u0437\u0430\u0434\u0430\u0447\u0438<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438:<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 routes.py<\/em><\/p>\n<pre><code class=\"python\">@app.route('\/select_task_for_me', methods=['GET', 'POST']) def select_task_for_me():     conn = get_db_connection(user_login, user_password)     my_task = select_task_for_user(conn, 1)     conn.close()     if request.method == 'POST': ...     return render_template('select_task_for_me.html', my_task=my_task)<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0435\u0441\u0442\u0443\u043f\u043b\u044e \u043a \u0432\u0435\u0440\u0441\u0442\u043a\u0435 \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 select_task_for_me.html<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"xml\">{% extends \"base.html\" %}  {% block title %}\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0437\u0430\u0434\u0430\u0447{% endblock %}  {% block content_h1 %} &lt;h1 style=\"text-align:center\">\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0437\u0430\u0434\u0430\u0447&lt;\/h1> {% endblock %}  {% block content %} &lt;div class=\"container\">     &lt;div class=\"row\">         {% for i, task in my_task.iterrows() %}             &lt;div class=\"col-lg-4 col-sm-12 mb-3\">                 &lt;div class=\"card-tovar\">                     &lt;div class=\"tovar-details\">                         &lt;form action=\"\" method=\"post\">                         &lt;table>                             &lt;tr>                                 &lt;td style=\"width: 25%\">                                     &lt;input type=\"hidden\" name=\"id_task\" value=\"{{task['task_id']}}\">                                     &lt;h4>{{task['task_id']}}&lt;\/h4>                                 &lt;\/td>                                 &lt;td>                                     &lt;h4>{{task['title']}}&lt;\/h4>                                 &lt;\/td>                             &lt;\/tr>                         &lt;\/table>                         &lt;hr>                         &lt;p>                            \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435: {{ task['description'] }}                         &lt;\/p>                         &lt;p>                             \u041a\u0443\u0440\u0430\u0442\u043e\u0440: {{ task['created_user'] }}                         &lt;\/p>                         &lt;p>                             \u0421\u0442\u0430\u0442\u0443\u0441: {{ task['status'] }}                         &lt;\/p>                         &lt;hr>                         &lt;p>                             \u0421\u0440\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: {{ task['control_date'] }}                         &lt;\/p>                         &lt;p>                             \u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c: {{ task['assigned_username'] }}                         &lt;\/p>                         &lt;input type=\"submit\" value=\"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443\"                                    style=\"width: 100%\">                         &lt;\/form>                     &lt;\/div>                 &lt;\/div>             &lt;\/div>         {% endfor %}     &lt;\/div> &lt;\/div>  {% endblock %}<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041a\u0430\u0440\u0442\u043e\u0447\u043a\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u0438\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/46b\/aa7\/ed1\/46baa7ed1a199c609f7f4b933bf9ee17.png\" width=\"353\" height=\"409\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/46b\/aa7\/ed1\/46baa7ed1a199c609f7f4b933bf9ee17.png\"\/><\/figure>\n<p>\u0410 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c  \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8bf\/384\/695\/8bf384695c97262f94367d74c3fdc30f.png\" width=\"973\" height=\"402\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8bf\/384\/695\/8bf384695c97262f94367d74c3fdc30f.png\"\/><\/figure>\n<h2>\u041f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h2>\n<p><a class=\"anchor\" name=\"%D0%B4%D0%BE%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8\" id=\"\u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438\"><\/a><\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0437\u0430\u0434\u0430\u0447\u0438 (\u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0441\u0442\u0430\u0434\u0438\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430).<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1d0\/6a5\/b4e\/1d06a5b4ec0e112b41c024988efebcef.png\" width=\"974\" height=\"353\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1d0\/6a5\/b4e\/1d06a5b4ec0e112b41c024988efebcef.png\"\/><\/figure>\n<p>\u041a\u043d\u043e\u043f\u043a\u0438 \u00ab\u041f\u0440\u0438\u043d\u044f\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443\u00bb \u0438 \u00ab\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443\u00bb \u0431\u0443\u0434\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 \u00ab\u0412 \u0440\u0430\u0431\u043e\u0442\u0435\u00bb \u0438 \u00ab\u0417\u0430\u043a\u0440\u044b\u0442\u0430\u00bb \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<ol start=\"2\">\n<li>\n<p>\u041a\u043d\u043e\u043f\u043a\u0430 \u00ab\u041f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443\u00bb \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441 \u043f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c (\u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0441\u0442\u0430\u0434\u0438\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430). \u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438.<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7f5\/0f3\/c1e\/7f50f3c1e899f568db9c9f54056451f7.png\" width=\"1236\" height=\"348\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7f5\/0f3\/c1e\/7f50f3c1e899f568db9c9f54056451f7.png\"\/><\/figure>\n<ol start=\"3\">\n<li>\n<p>\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0433\u0434\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0433 \u0431\u044b \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u043e\u043d (\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u0430 \u00ab\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0437\u0430\u0434\u0430\u0447\u00bb, \u043d\u043e \u0438\u043c\u0435\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u00ab\u0417\u0430\u0434\u0430\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u043b \u044f\u00bb \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 (\u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0441\u0442\u0430\u0434\u0438\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430).<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e7b\/d7d\/396\/e7bd7d3964260c97b159f89246fb2c5f.png\" width=\"973\" height=\"372\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e7b\/d7d\/396\/e7bd7d3964260c97b159f89246fb2c5f.png\"\/><\/figure>\n<ol start=\"5\">\n<li>\n<p>\u0411\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u00ab\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443\u00bb. \u0414\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u044b (\u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0441\u0442\u0430\u0434\u0438\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430).<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/574\/511\/95f\/57451195f287530333be3f24c703fa5d.png\" width=\"892\" height=\"1188\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/574\/511\/95f\/57451195f287530333be3f24c703fa5d.png\"\/><\/figure>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p><a class=\"anchor\" name=\"%D0%B7%D0%B0%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5\" id=\"\u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\"><\/a><\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u044f \u0438 \u0441\u0434\u0435\u043b\u0430\u043b MVP \u0441\u0432\u043e\u0435\u0433\u043e task manager&#8217;\u0430. \u0412\u00a0\u0441\u043a\u043e\u0440\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0443\u043b\u0443\u0447\u0448\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0435\u0441\u044f \u041f\u041e. \u0414\u0430\u043b\u0435\u0435 \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u0433\u043b\u0430\u0437\u0443 \u0434\u0438\u0437\u0430\u0439\u043d, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u043d\u043a\u0442\u044b \u0438\u0437\u00a0\u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u00ab\u041f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438\u00bb, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 \u0431\u0430\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0439\u0434\u0443\u0442\u0441\u044f \u0432\u00a0\u043f\u0435\u0440\u0432\u044b\u0439 \u0434\u0435\u043d\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. <\/p>\n<p>\u041a\u0430\u043a\u00a0\u0442\u043e\u043b\u044c\u043a\u043e \u044f \u0432\u044b\u043f\u0443\u0449\u0443 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e task manager&#8217;a, \u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044e \u043a\u00a0\u043d\u0435\u0439 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0434\u043b\u044f\u00a0\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u0430\u0434\u0430\u0447\u043d\u0438\u043a\u0430 \u043f\u043e\u0434\u00a0\u0441\u0432\u043e\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/772488\/\"> https:\/\/habr.com\/ru\/articles\/772488\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>\u041d\u0430\u00a0\u0441\u0432\u044f\u0437\u0438 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a <a href=\"https:\/\/newtechaudit.ru\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 NTA<\/a> \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u0420\u0443\u043b\u0435\u0432.<\/p>\n<p>\u042d\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0441\u0442 \u0432\u00a0\u0441\u0435\u0440\u0438\u0438, \u0433\u0434\u0435 \u044f \u0431\u0443\u0434\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c, \u043a\u0430\u043a\u00a0\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 <a href=\"https:\/\/xn--80aidjgwzd.xn--p1ai\/news\/task_manager_kak_vybrat_i_rabotat\/\" rel=\"noopener noreferrer nofollow\">task manager<\/a>. \u0412\u00a0\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f\u00a0\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438, \u043e\u0442\u00a0\u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b \u0438 Excel\u2011\u0442\u0430\u0431\u043b\u0438\u0446 \u0434\u043e\u00a0\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c. \u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u00a0\u2014 \u043f\u0438\u0441\u044c\u043c\u0430 \u0438 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0438, \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u044f\u0435\u0442 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0437\u0430\u0434\u0430\u0447, \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u043e\u0431\u0449\u0443\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u044e \u0440\u0430\u0431\u043e\u0442. \u0412\u0442\u043e\u0440\u043e\u0439\u00a0\u2014 \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0438\u043c\u0435\u0435\u0442 \u043a\u0430\u043a\u00a0\u043f\u043b\u044e\u0441\u044b, \u0442\u0430\u043a \u0438 \u043c\u0438\u043d\u0443\u0441\u044b. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0441\u0438\u043b\u044c\u043d\u044b\u0435 \u0438 \u0441\u043b\u0430\u0431\u044b\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043d\u0430\u00a0\u0440\u044b\u043d\u043a\u0435 task\u2011\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u044b <a href=\"https:\/\/weeek.net\/ru\/blog\/luchshie-task-menedzhery\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u00a0\u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0434\u0430\u0441\u0442 \u043c\u043d\u0435:<\/p>\n<ol>\n<li>\n<p><em>\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438. <\/em><\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0432\u0435\u0441\u0442\u0438 \u0432\u0441\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u00a0\u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0447\u0442\u043e\u00a0\u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442 \u0438\u0445 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435, \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430\u043c\u0438. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043c\u043e\u0436\u0435\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u0441\u0432\u043e\u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0441\u0442\u0430\u0442\u0443\u0441.<\/p>\n<\/li>\n<li>\n<p><em>\u0410\u043d\u0430\u043b\u0438\u0437 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. <\/em><\/p>\n<p>\u041f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0437\u0430\u0434\u0430\u0447, \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u043c \u043d\u0430\u00a0\u043a\u0430\u0436\u0434\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443, \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0422\u0430\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b, \u0432\u044b\u044f\u0432\u043b\u044f\u0442\u044c \u0443\u0437\u043a\u0438\u0435 \u043c\u0435\u0441\u0442\u0430 \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043c\u0435\u0440\u044b \u0434\u043b\u044f\u00a0\u0438\u0445 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ol>\n<details class=\"spoiler\">\n<summary>\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u043f\u043e \u043f\u043e\u0441\u0442\u0443<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p><a href=\"#%D0%B2%D1%8B%D0%B1%D0%BE%D1%80\" rel=\"noopener noreferrer nofollow\">\u0412\u044b\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u00ab\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f\u00bb<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%BF%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D1%8C\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u00ab\u041f\u0440\u043e\u0444\u0438\u043b\u044c\u00bb<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u00ab\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438\u00bb<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0437\u0430\u0434\u0430\u0447<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%B4%D0%BE%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%B7%D0%B0%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<h2>\u0412\u044b\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/h2>\n<p><a class=\"anchor\" name=\"%D0%B2%D1%8B%D0%B1%D0%BE%D1%80\" id=\"\u0432\u044b\u0431\u043e\u0440\">\u043e\u0440&#187;<\/a><\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a\u0438\u0435 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438 \u0441\u0442\u043e\u0438\u0442 \u0443\u0447\u0435\u0441\u0442\u044c:<\/p>\n<p><em>1.\u00a0\u0418\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/em><\/p>\n<p>\u041d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439, \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0443\u0440\u043e\u0432\u043d\u044f \u0437\u043d\u0430\u043d\u0438\u0439.\u00a0\u00a0 <\/p>\n<p><em>2.\u00a0\u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438.<\/em><\/p>\n<p>\u0422\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u0443\u0442\u0451\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0441 \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438. <\/p>\n<p>\u041e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u044e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430:<\/p>\n<ul>\n<li>\n<p>\u043f\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0432 Jupyter Notebook;<\/p>\n<\/li>\n<li>\n<p>web-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u043b\u0430 \u0438\u0434\u0435\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 Jupyter Notebook \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 ipywidgets, \u043d\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0430 \u0438\u043c\u0435\u044e\u0449\u0435\u0439\u0441\u044f \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u0437\u0430\u0434\u0443\u043c\u0430\u043d\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u0442\u043e \u0444\u043e\u043a\u0443\u0441 \u0441\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u0430\u0439\u0442\u0430. <\/p>\n<p>\u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441\u0430\u0439\u0442 \u043b\u0435\u0433\u0447\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0447\u0435\u043c Jupyter Notebook, \u0430 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0434\u0438\u0437\u0430\u0439\u043d \u0438 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0430 \u0437\u0430\u0434\u0430\u0447\u043d\u0438\u043a\u0430, \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0422\u0430\u043a \u043a\u0430\u043a\u00a0\u0443\u00a0\u0432\u0441\u0435\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d python, \u0442\u043e \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u0442\u0438\u0441\u044c \u043d\u0430\u00a0\u043d\u0451\u043c. \u041d\u0430\u00a0\u0441\u0442\u0430\u0440\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0443\u0434\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<ul>\n<li>\n<p><strong>Flask\u00a0\u2014 <\/strong>\u043b\u0435\u0433\u043a\u0438\u0439 \u0438 \u0433\u0438\u0431\u043a\u0438\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0435\u0431\u2011\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p><strong>Flask\u2011WTF\u00a0\u2014 <\/strong>\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 Flask, \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 WTForms, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u043e\u0440\u043c \u0432\u00a0\u0432\u0435\u0431\u2011\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438; <\/p>\n<\/li>\n<li>\n<p><strong>Psycopg2\u00a0\u2014 <\/strong>\u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 PostgreSQL \u0434\u043b\u044f\u00a0Python, \u0442.\u043a. \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e Greenplum;<\/p>\n<\/li>\n<li>\n<p><strong>Pandas \u2014<\/strong> \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f\u00a0\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0445\u0432\u0430\u0442\u0438\u0442. <\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u00ab\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f\u00bb<\/h2>\n<p><a class=\"anchor\" name=\"%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F\" id=\"\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f\">\u0437\u0430\u0446\u0438\u044f&#187;<\/a><\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<pre><code class=\"python\">$ pip install flask        $ pip install flask-wtf $ pip install pandas $ pip install psycopg2<\/code><\/pre>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0435\u0431\u2011\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u0440\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u00a0PyCharm&#8217;\u0435 \u0438 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430\u00a0\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a.<\/p>\n<figure class=\"\"><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0432 \u0444\u0430\u0439\u043b\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 __init__.py<\/em><\/p>\n<pre><code class=\"python\">from flask import Flask app = Flask(name) from app import routes<\/code><\/pre>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 routes.py<\/em><\/p>\n<pre><code class=\"python\">from app import app  @app.route('\/') @app.route('\/index') def login():     return ('Hello, World!')<\/code><\/pre>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0447\u0442\u043e\u00a0\u0436\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b @app.route. \u0412\u00a0\u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 URL\u2011\u0430\u0434\u0440\u0435\u0441\u043e\u043c, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430, \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0438\u0436\u0435. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u043e\u0433\u0434\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u00ab\/\u00bb \u0438\u043b\u0438 \u00ab\/index\u00bb, Flask \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0438\u0436\u0435 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0441\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432\u00a0\u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 startup.py<\/em><\/p>\n<pre><code class=\"python\">from app import app   if __name__ == '__main__':     app.run()<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0449\u0443 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0443 \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<figure class=\"\"><\/figure>\n<p>\u0421\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u0434\u043d\u044f\u043b\u0441\u044f, \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u043c \u0444\u043e\u0440\u043c\u0443 \u0434\u043b\u044f\u00a0\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0438\u00a0\u0431\u044b\u043b\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"https:\/\/flask-wtf.readthedocs.io\/en\/1.2.x\/\" rel=\"noopener noreferrer nofollow\">Flask\u2011WTF<\/a>. <\/p>\n<p>\u0412\u00a0\u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u0441\u044f \u043e\u00a0\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u043d\u043e\u00a0\u0432\u0441\u0451\u00a0\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043c config \u0432\u00a0\u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044e __init__.py<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 config.py<\/em><\/p>\n<pre><code class=\"python\">import os  class Config(object):     SECRET_KEY = os.environ.get('SECRET_KEY') or 'never-gonna-give-you-up'<\/code><\/pre>\n<p>Flask \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u044e\u0447\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0435\u0439 \u0438 \u0442\u043e\u043a\u0435\u043d\u043e\u0432. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 Flask-WTF \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u0437\u0430\u0449\u0438\u0442\u044b \u0432\u0435\u0431-\u0444\u043e\u0440\u043c\u044b \u043e\u0442 \u0430\u0442\u0430\u043a\u0438 Cross-Site Request Forgery (\u043f\u043e\u0434\u0434\u0435\u043b\u043a\u0430 \u043c\u0435\u0436\u0441\u0430\u0439\u0442\u043e\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432).<\/p>\n<p><strong>\u0412\u0430\u0436\u043d\u043e:<\/strong> \u043f\u0440\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438 \u0442\u0440\u0443\u0434\u043d\u043e \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0421\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439 \u043a\u0440\u0443\u0433 \u043b\u0438\u0446, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u044e\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435!<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 __init__.py<\/em><\/p>\n<pre><code class=\"python\">from flask import Flask from config import Config  app = Flask(__name__) app.config.from_object(Config)  from app import routes<\/code><\/pre>\n<p>\u041c\u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 forms.py<\/em><\/p>\n<pre><code class=\"python\">from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField  from wtforms.validators import DataRequired  class LoginForm(FlaskForm):     username = StringField('Username', validators=[DataRequired()])     password = PasswordField('Password', validators=[DataRequired()])     submit = SubmitField('\u0412\u043e\u0439\u0442\u0438')<\/code><\/pre>\n<ul>\n<li>\n<p><strong>StringField<\/strong> \u2013 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430, \u0432 HTML \u0440\u0430\u0432\u043d\u043e \u0442\u0435\u0433\u0443 &lt;input type=\u201dtext\u201d>;<\/p>\n<\/li>\n<li>\n<p><strong>PasswordField<\/strong> \u2013 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f, \u0432 HTML \u0440\u0430\u0432\u043d\u043e \u0442\u0435\u0433\u0443 &lt;input type=\u201dpassword\u201d>;<\/p>\n<\/li>\n<li>\n<p><strong>SubmitField \u2013 <\/strong>\u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0444\u043e\u0440\u043c\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u0432 HTML \u0440\u0430\u0432\u043d\u043e \u0442\u0435\u0433\u0443 &lt;input type=\u201dsubmit\u201d>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c html \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0443, \u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435.<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 index.html<\/em><\/p>\n<pre><code class=\"xml\">&lt;!DOCTYPE html> &lt;html lang=\"ru\"> &lt;head>     &lt;meta charset=\"UTF-8\">     &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">     &lt;link rel=\"stylesheet\" type=\"text\/css\" href=\"{{ url_for( 'static', filename='my_style.css' )}}\">     &lt;link rel=\"stylesheet\" type=\"text\/css\" href=\"{{ url_for( 'static', filename='style.css' )}}\">     &lt;title>\u0417\u0430\u0434\u0430\u0447\u043d\u0438\u043a \u041e\u0410\u0420\u0411 - \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f&lt;\/title> &lt;\/head> &lt;style> &lt;\/style> &lt;body>     &lt;div class=\"authorization position-absolute top-50 start-50 translate-middle\">         &lt;div class=\"position-absolute top-50 start-50 translate-middle\">             &lt;h1>\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f&lt;\/h1>&lt;br>             &lt;form action=\"\" method=\"post\" novalidate>                 {{ form.hidden_tag() }}                 &lt;p>                     {{ form.username(size=32, placeholder=\"login\") }}&lt;br>                     {% for error in form.username.errors %}                     &lt;span style=\"color: red;\">[{{ error }}]&lt;\/span>                     {% endfor %}                 &lt;\/p>                 &lt;p>                     {{ form.password(size=32, placeholder=\"password\") }}&lt;br>                     {% for error in form.password.errors %}                     &lt;span style=\"color: red;\">[{{ error }}]&lt;\/span>                     {% endfor %}                 &lt;\/p>                 &lt;p style=\"color: red\">{{ form.error_connect.label }}&lt;\/p>                 &lt;p>{{ form.submit() }}&lt;\/p>             &lt;\/form>         &lt;\/div>     &lt;\/div> &lt;\/body> &lt;\/html> <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0444\u0430\u0439\u043b routes \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 routes.py<\/em><\/p>\n<pre><code class=\"python\">from flask import render_template, redirect   from app import app from app.forms import LoginForm  @app.route('\/') @app.route('\/index') def login():     form = LoginForm()     return render_template('index.html', form=form)<\/code><\/pre>\n<p>\u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<figure class=\"\"><\/figure>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u00ab\u041f\u0440\u043e\u0444\u0438\u043b\u044c\u00bb<\/h2>\n<p><a class=\"anchor\" name=\"%D0%BF%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D1%8C\" id=\"\u043f\u0440\u043e\u0444\u0438\u043b\u044c\">\u0438\u043b\u044c&#187;<\/a><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u044f \u0441\u0432\u0435\u0440\u0441\u0442\u0430\u043b \u0444\u043e\u0440\u043c\u0443, \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u00a0\u0411\u0414. \u0414\u043b\u044f\u00a0\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 psycopg2, \u0430\u00a0\u0434\u043b\u044f\u00a0\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u044c\u043c\u0443 pandas. <\/p>\n<p>\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<pre><code class=\"python\">import pandas as pd import psycopg2 as pg<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u043c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0411\u0414:<\/p>\n<p><em>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 routes.py<\/em><\/p>\n<pre><code class=\"python\"># \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0411\u0414 Greenplum def get_db_connection(user, password):     try:         # \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f         global user_login         global user_password         user_login = user         user_password = password          # \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f         conn_param = f'host=server.ru port=1234 dbname=mydb user={user} password={password}'                  # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0430\u0432\u0442\u043e\u043a\u043e\u043c\u0438\u0442         conn = pg.connect(conn_param)         conn.autocommit = True          return conn     except pg.OperationalError: # \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435         print(\"EGOOOOOOOOOOOOOOOOOOOR:\", pg.OperationalError)         return 0<\/code><\/pre>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u044e \u043c\u0435\u0442\u043e\u0434 login:<\/p>\n<pre><code class=\"python\">@app.route('\/', methods=['GET', 'POST']) @app.route('\/index', methods=['GET', 'POST']) def login():     # \u0421\u043e\u0437\u0434\u0430\u043c \u0444\u043e\u0440\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438     form = LoginForm()     # \u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0443     if form.validate_on_submit(): # \u0421\u043e\u0437\u0434\u0430\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435         global conn  # form.username.data \u2013 \u043b\u043e\u0433\u0438\u043d \u0441 \u0444\u043e\u0440\u043c\u044b # form.password.data \u2013 \u043f\u0430\u0440\u043e\u043b\u044c \u0441 \u0444\u043e\u0440\u043c\u044b         conn = get_db_connection(str(form.username.data), str(form.password.data))  # \u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043e         if conn:             return redirect('\/main')     return render_template('index.html', form=form) <\/code><\/pre>\n<p>\u0427\u0443\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u044e\u0441\u044c \u043d\u0430\u00a0\u044d\u0442\u043e\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0435.<\/p>\n<p>\u0412\u00a0\u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <em>methods. <\/em>\u042d\u0442\u0438\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u044f \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e, \u0447\u0442\u043e\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b GET \u0438 POST (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e GET \u0437\u0430\u043f\u0440\u043e\u0441\u044b). <\/p>\n<p><em>GET\u2011\u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/em>\u00a0\u2014 \u044d\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043a\u043b\u0438\u0435\u043d\u0442\u0443 (\u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u00a0\u2014 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0432\u00a0\u0432\u0435\u0431\u2011\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435).<\/p>\n<p><em>POST\u2011\u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/em>\u00a0\u2014 \u044d\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u0438\u00a0\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c \u0444\u043e\u0440\u043c\u044b \u043d\u0430\u00a0\u0441\u0435\u0440\u0432\u0435\u0440 (\u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u00a0\u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u043b\u043e\u0433\u0438\u043d\u0430 \u0438 \u043f\u0430\u0440\u043e\u043b\u044f). <\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u044e \u043c\u0435\u0442\u043e\u0434 <em>form.validate_on_submit()<\/em>. \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0444\u043e\u0440\u043c\u044b<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-359558","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/359558","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=359558"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/359558\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=359558"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=359558"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=359558"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}