Tonya7enova

домашка на 22.9.25

Sep 22nd, 2025
6
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.85 KB | None | 0 0
  1. main.py
  2. from flask import Flask, render_template, redirect, request
  3.  
  4. app = Flask(__name__)
  5.  
  6. categories = [
  7. {
  8. "id": 0,
  9. "name": "Фанфики про Лунтика",
  10. "fanfics": [
  11. {
  12. "id": 0,
  13. "title": "Лунтик и Проклятие Единого Кольца",
  14. "text": "Измотанный лунтик уже год нес кольцо в мордор, и лембас был на исходе. Он велел мне быстро собраться и выйти во двор, чтобы немного отдышаться. У меня возникло нехорошее предчувствие. Я подумал, что с моим приятелем случилось что-то неладное. Этот лунтик был одним из моих наиболее уважаемых клиентов, и никогда раньше мы с ним не расставались.",
  15. "likes": 427
  16. },
  17. {
  18. "id": 1,
  19. "title": "Лунтик: Перезагрузка",
  20. "text": "Лунтик подключился к матрице и тут же направился на поиски Тринити. Вместе с ним побрел в зал тот самый павиан, у которого товарищ во время первого опыта подал сигнал тревоги. Вместе с павианом тоже отправился рядышком работник ларингологического центра, который своими глазами видел условного контактного попугая вживую. Так сказать, семейный характер опыта.",
  21. "likes": 93
  22. },
  23. {
  24. "id": 2,
  25. "title": "Лунтик в Бобруйске: Миссия выполнима",
  26. "text": "Вот наконец за окнами поезда появился Бобруйск. Он встретил Лунтика неприветливым дождем. Под мокрыми тентами там и сям стояли разноцветные машины, будто все они были машинами времени. Когда Лунтик прошел внутрь вокзала, лица у встречавших вытянулись. Да даже оживление, с которым он шел, показалось им странно театральным.",
  27. "likes": 42
  28. },
  29. {
  30. "id": 3,
  31. "title": "Звездные войны: Эпизод Лунтик",
  32. "text": "Звездолет капитана Лунтика дрейфовал где-то в районе Венеры. Топливо заканчивалось, но сила духа неиссякала. Было время, когда капитан Лунтик надеялся попасть на Землю и даже послал на разведку какой-то металлический корабль, который описал в своем рапорте около десятка кругов вокруг планеты. Наверно, на обратном пути он дал сам себе слово «не возвращаться».",
  33. "likes": 567
  34. }
  35. ]
  36. },
  37. {
  38. "id": 1,
  39. "name": "Фанфики про Вупсеня",
  40. "fanfics": [
  41. {
  42. "id": 0,
  43. "title": "Вупсень: Крестный отец",
  44. "text": "Заходит Вупсень в бар. На него бабы и мужики смотрят, млеют. Тут один мент спрашивает: А кто это такой у вас? А Вупсень, не будь дурак, подходит к менту, приставил ему пистолет ко лбу и говорит: Я — Вупсень, убийца ментов! И прямо-таки вот этой самой ножкой тычет в лоб менту. Все аж замерли. Только один мент еле слышно хихикнул. Ну Вупсень сам и говорит: «Ты мент или нет?» Мент еще громче захихикал. И тут, естественно, вокруг паника. Одна баба кричит: «Я Барыню видела!» И тут же — бах! бах! трах! трах! и прочие террористические акты. Потом Вупсень как раз работал официантом в ресторане. Барыня его и запомнила.",
  45. "likes": 789
  46. },
  47. {
  48. "id": 1,
  49. "title": "Вупсень и таинственная лягушка",
  50. "text": "Купил Вупсень шляпу, и пошел с ней прямо в лес, и стал ходить по лесу, и наконец подошел к большой луже. Глядит – а там лягушка сидит и еще один такой же. А первый кричит: «Ты чего сюда забрел? Иди отсюда!» – «Я, говорит, пришел на лягушку посмотреть, какая она».",
  51. "likes": 234
  52. }
  53. ]
  54. }
  55. ]
  56.  
  57. @app.route('/')
  58. def index():
  59. return render_template('index.html', categories=categories)
  60.  
  61.  
  62. @app.route('/category/<int:category_id>')
  63. def category_page(category_id):
  64. category = None
  65. for cat in categories:
  66. if cat["id"] == category_id:
  67. category = cat
  68. break
  69.  
  70. return render_template('category.html', category=category)
  71.  
  72. @app.route('/category/<int:category_id>/fanfic/<int:fanfic_id>/like')
  73. def add_like(category_id, fanfic_id):
  74. category = None
  75. for cat in categories:
  76. if cat["id"] == category_id:
  77. category = cat
  78. break
  79.  
  80. for f in category["fanfics"]:
  81. if f["id"] == fanfic_id:
  82. fanfic = f
  83. break
  84.  
  85. fanfic["likes"] += 1
  86. return redirect(f'/category/{category_id}')
  87.  
  88. @app.route('/category/add', methods=['GET', 'POST'])
  89. def add_category():
  90. if request.method == 'POST':
  91. name = request.form.get('name')
  92. if name:
  93. new_id = max([cat["id"] for cat in categories]) + 1 if categories else 0
  94. categories.append({
  95. "id": new_id,
  96. "name": name,
  97. "fanfics": []
  98. })
  99. return redirect('/')
  100.  
  101. return render_template('edit_category.html')
  102.  
  103. @app.route('/category/<int:category_id>/edit', methods=['GET', 'POST'])
  104. def edit_category(category_id):
  105. category = None
  106. for cat in categories:
  107. if cat["id"] == category_id:
  108. category = cat
  109. break
  110.  
  111. if request.method == 'POST':
  112. name = request.form.get('name')
  113. if name:
  114. category["name"] = name
  115. return redirect('/')
  116.  
  117. return render_template('edit_category.html', category=category)
  118.  
  119. @app.route('/category/<int:category_id>/delete')
  120. def delete_category(category_id):
  121. global categories
  122. categories = [cat for cat in categories if cat["id"] != category_id]
  123. return redirect('/')
  124.  
  125. @app.route('/category/<int:category_id>/fanfic/add', methods=['GET', 'POST'])
  126. def add_fanfic(category_id):
  127. category = None
  128. for cat in categories:
  129. if cat["id"] == category_id:
  130. category = cat
  131. break
  132.  
  133. if request.method == 'POST':
  134. title = request.form.get('title')
  135. text = request.form.get('text')
  136. if title and text:
  137. new_id = max([f["id"] for f in category["fanfics"]]) + 1 if category["fanfics"] else 0
  138. category["fanfics"].append({
  139. "id": new_id,
  140. "title": title,
  141. "text": text,
  142. "likes": 0
  143. })
  144. return redirect(f'/category/{category_id}')
  145.  
  146. return render_template('edit_fanfic.html', category=category)
  147.  
  148. @app.route('/category/<int:category_id>/fanfic/<int:fanfic_id>/edit', methods=['GET', 'POST'])
  149. def edit_fanfic(category_id, fanfic_id):
  150. category = None
  151. for cat in categories:
  152. if cat["id"] == category_id:
  153. category = cat
  154. break
  155.  
  156. fanfic = None
  157. for f in category["fanfics"]:
  158. if f["id"] == fanfic_id:
  159. fanfic = f
  160. break
  161.  
  162. if request.method == 'POST':
  163. title = request.form.get('title')
  164. text = request.form.get('text')
  165. if title and text:
  166. fanfic["title"] = title
  167. fanfic["text"] = text
  168. return redirect(f'/category/{category_id}')
  169.  
  170. return render_template('edit_fanfic.html', category=category, fanfic=fanfic)
  171.  
  172. @app.route('/category/<int:category_id>/fanfic/<int:fanfic_id>/delete')
  173. def delete_fanfic(category_id, fanfic_id):
  174. category = None
  175. for cat in categories:
  176. if cat["id"] == category_id:
  177. category = cat
  178. break
  179.  
  180. category["fanfics"] = [f for f in category["fanfics"] if f["id"] != fanfic_id]
  181. return redirect(f'/category/{category_id}')
  182.  
  183. if __name__ == '__main__':
  184. app.run(debug=True)
  185.  
  186.  
  187.  
  188. templates/index.html
  189. <!DOCTYPE html>
  190. <html>
  191. <head>
  192. <title>Фанфики</title>
  193. <style>
  194. body { font-family: Arial; margin: 40px; }
  195. .category { border: 2px solid #ccc; padding: 15px; margin: 10px 0; border-radius: 5px; }
  196. .btn { padding: 8px 15px; margin: 5px; text-decoration: none; border-radius: 3px; }
  197. .btn-primary { background: #007bff; color: white; }
  198. .btn-success { background: #28a745; color: white; }
  199. .btn-danger { background: #dc3545; color: white; }
  200. .btn-warning { background: #ffc107; color: black; }
  201. </style>
  202. </head>
  203. <body>
  204. <h1>Фанфики по вселенной Лунтика</h1>
  205.  
  206. <a href="/category/add" class="btn btn-success">Добавить категорию</a>
  207.  
  208. {% for category in categories %}
  209. <div class="category">
  210. <h2>
  211. <a href="/category/{{ category.id }}">{{ category.name }}</a>
  212. </h2>
  213. <p>Фанфиков:{{ category.fanfics|length }}</p>
  214. <div>
  215. <a href="/category/{{ category.id }}/edit" class="btn btn-warning">Изменить</a>
  216. <a href="/category/{{ category.id }}/delete" class="btn btn-danger" onclick="return confirm('Удалить категорию?')">Удалить</a>
  217. </div>
  218. </div>
  219. {% endfor %}
  220. </body>
  221. </html>
  222.  
  223.  
  224.  
  225. templates/category.html
  226. <!DOCTYPE html>
  227. <html>
  228. <head>
  229. <title>{{ category.name }}</title>
  230. <style>
  231. body { font-family: Arial; margin: 40px; }
  232. .fanfic { border: 1px solid #ddd; padding: 15px; margin: 10px 0; border-radius: 3px; }
  233. .btn { padding: 5px 10px; margin: 2px; text-decoration: none; border-radius: 3px; font-size: 14px; }
  234. .btn-primary { background: #007bff; color: white; }
  235. .btn-success { background: #28a745; color: white; }
  236. .btn-danger { background: #dc3545; color: white; }
  237. .btn-warning { background: #ffc107; color: black; }
  238. .popular { border-left: 4px solid red; }
  239. </style>
  240. </head>
  241. <body>
  242. <a href="/">К категориям</a>
  243. <h1>{{ category.name }}</h1>
  244.  
  245. <a href="/category/{{ category.id }}/fanfic/add" class="btn btn-success">Добавить фанфик</a>
  246.  
  247. {% for fanfic in category.fanfics %}
  248. <div class="fanfic {% if fanfic.likes > 100 %}popular{% endif %}">
  249. <h2>{{ fanfic.title }}</h2>
  250. <p>{{ fanfic.text }}</p>
  251. <div>
  252. <a href="/category/{{ category.id }}/fanfic/{{ fanfic.id }}/like" class="btn btn-primary">Лайк{{ fanfic.likes }}</a>
  253. <a href="/category/{{ category.id }}/fanfic/{{ fanfic.id }}/edit" class="btn btn-warning">Изменить</a>
  254. <a href="/category/{{ category.id }}/fanfic/{{ fanfic.id }}/delete" class="btn btn-danger" onclick="return confirm('Удалить фанфик?')">Удалить</a>
  255. </div>
  256. </div>
  257. {% endfor %}
  258. </body>
  259. </html>
  260.  
  261.  
  262. templates/edit_category.html
  263. <!DOCTYPE html>
  264. <html>
  265. <head>
  266. <title>{% if category %}Изменить{% else %}Добавить{% endif %} категорию</title>
  267. <style>
  268. body { font-family: Arial; margin: 40px; }
  269. .form-group { margin: 15px 0; }
  270. input[type="text"] { padding: 8px; width: 300px; }
  271. .btn { padding: 8px 15px; margin: 5px; text-decoration: none; border-radius: 3px; }
  272. .btn-primary { background: #007bff; color: white; border: none; }
  273. .btn-secondary { background: #6c757d; color: white; }
  274. </style>
  275. </head>
  276. <body>
  277. <h1>{% if category %}Изменить категорию{% else %}Добавить категорию{% endif %}</h1>
  278.  
  279. <form method="POST">
  280. <div class="form-group">
  281. <label>Название категории:</label><br>
  282. <input type="text" name="name" value="{{ category.name if category else '' }}" required>
  283. </div>
  284.  
  285. <button type="submit" class="btn btn-primary">Сохранить</button>
  286. <a href="/" class="btn btn-secondary">Отмена</a>
  287. </form>
  288. </body>
  289. </html>
  290.  
  291.  
  292.  
  293. templates/edit_fanfic.html
  294. <!DOCTYPE html>
  295. <html>
  296. <head>
  297. <title>{% if fanfic %}Изменить{% else %}Добавить{% endif %} фанфик</title>
  298. <style>
  299. body { font-family: Arial; margin: 40px; }
  300. .form-group { margin: 15px 0; }
  301. input[type="text"], textarea { padding: 8px; width: 500px; }
  302. textarea { height: 200px; }
  303. .btn { padding: 8px 15px; margin: 5px; text-decoration: none; border-radius: 3px; }
  304. .btn-primary { background: #007bff; color: white; border: none; }
  305. .btn-secondary { background: #6c757d; color: white; }
  306. </style>
  307. </head>
  308. <body>
  309. <h1>{% if fanfic %}Изменить фанфик{% else %}Добавить фанфик в {{ category.name }}{% endif %}</h1>
  310.  
  311. <form method="POST">
  312. <div class="form-group">
  313. <label>Название:</label><br>
  314. <input type="text" name="title" value="{{ fanfic.title if fanfic else '' }}" required>
  315. </div>
  316.  
  317. <div class="form-group">
  318. <label>Текст:</label><br>
  319. <textarea name="text" required>{{ fanfic.text if fanfic else '' }}</textarea>
  320. </div>
  321.  
  322. <button type="submit" class="btn btn-primary">Сохранить</button>
  323. <a href="/category/{{ category.id }}" class="btn btn-secondary">Отмена</a>
  324. </form>
  325. </body>
  326. </html>
Add Comment
Please, Sign In to add comment