Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- main.py
- from flask import Flask, render_template, redirect, request
- app = Flask(__name__)
- categories = [
- {
- "id": 0,
- "name": "Фанфики про Лунтика",
- "fanfics": [
- {
- "id": 0,
- "title": "Лунтик и Проклятие Единого Кольца",
- "text": "Измотанный лунтик уже год нес кольцо в мордор, и лембас был на исходе. Он велел мне быстро собраться и выйти во двор, чтобы немного отдышаться. У меня возникло нехорошее предчувствие. Я подумал, что с моим приятелем случилось что-то неладное. Этот лунтик был одним из моих наиболее уважаемых клиентов, и никогда раньше мы с ним не расставались.",
- "likes": 427
- },
- {
- "id": 1,
- "title": "Лунтик: Перезагрузка",
- "text": "Лунтик подключился к матрице и тут же направился на поиски Тринити. Вместе с ним побрел в зал тот самый павиан, у которого товарищ во время первого опыта подал сигнал тревоги. Вместе с павианом тоже отправился рядышком работник ларингологического центра, который своими глазами видел условного контактного попугая вживую. Так сказать, семейный характер опыта.",
- "likes": 93
- },
- {
- "id": 2,
- "title": "Лунтик в Бобруйске: Миссия выполнима",
- "text": "Вот наконец за окнами поезда появился Бобруйск. Он встретил Лунтика неприветливым дождем. Под мокрыми тентами там и сям стояли разноцветные машины, будто все они были машинами времени. Когда Лунтик прошел внутрь вокзала, лица у встречавших вытянулись. Да даже оживление, с которым он шел, показалось им странно театральным.",
- "likes": 42
- },
- {
- "id": 3,
- "title": "Звездные войны: Эпизод Лунтик",
- "text": "Звездолет капитана Лунтика дрейфовал где-то в районе Венеры. Топливо заканчивалось, но сила духа неиссякала. Было время, когда капитан Лунтик надеялся попасть на Землю и даже послал на разведку какой-то металлический корабль, который описал в своем рапорте около десятка кругов вокруг планеты. Наверно, на обратном пути он дал сам себе слово «не возвращаться».",
- "likes": 567
- }
- ]
- },
- {
- "id": 1,
- "name": "Фанфики про Вупсеня",
- "fanfics": [
- {
- "id": 0,
- "title": "Вупсень: Крестный отец",
- "text": "Заходит Вупсень в бар. На него бабы и мужики смотрят, млеют. Тут один мент спрашивает: А кто это такой у вас? А Вупсень, не будь дурак, подходит к менту, приставил ему пистолет ко лбу и говорит: Я — Вупсень, убийца ментов! И прямо-таки вот этой самой ножкой тычет в лоб менту. Все аж замерли. Только один мент еле слышно хихикнул. Ну Вупсень сам и говорит: «Ты мент или нет?» Мент еще громче захихикал. И тут, естественно, вокруг паника. Одна баба кричит: «Я Барыню видела!» И тут же — бах! бах! трах! трах! и прочие террористические акты. Потом Вупсень как раз работал официантом в ресторане. Барыня его и запомнила.",
- "likes": 789
- },
- {
- "id": 1,
- "title": "Вупсень и таинственная лягушка",
- "text": "Купил Вупсень шляпу, и пошел с ней прямо в лес, и стал ходить по лесу, и наконец подошел к большой луже. Глядит – а там лягушка сидит и еще один такой же. А первый кричит: «Ты чего сюда забрел? Иди отсюда!» – «Я, говорит, пришел на лягушку посмотреть, какая она».",
- "likes": 234
- }
- ]
- }
- ]
- @app.route('/')
- def index():
- return render_template('index.html', categories=categories)
- @app.route('/category/<int:category_id>')
- def category_page(category_id):
- category = None
- for cat in categories:
- if cat["id"] == category_id:
- category = cat
- break
- return render_template('category.html', category=category)
- @app.route('/category/<int:category_id>/fanfic/<int:fanfic_id>/like')
- def add_like(category_id, fanfic_id):
- category = None
- for cat in categories:
- if cat["id"] == category_id:
- category = cat
- break
- for f in category["fanfics"]:
- if f["id"] == fanfic_id:
- fanfic = f
- break
- fanfic["likes"] += 1
- return redirect(f'/category/{category_id}')
- @app.route('/category/add', methods=['GET', 'POST'])
- def add_category():
- if request.method == 'POST':
- name = request.form.get('name')
- if name:
- new_id = max([cat["id"] for cat in categories]) + 1 if categories else 0
- categories.append({
- "id": new_id,
- "name": name,
- "fanfics": []
- })
- return redirect('/')
- return render_template('edit_category.html')
- @app.route('/category/<int:category_id>/edit', methods=['GET', 'POST'])
- def edit_category(category_id):
- category = None
- for cat in categories:
- if cat["id"] == category_id:
- category = cat
- break
- if request.method == 'POST':
- name = request.form.get('name')
- if name:
- category["name"] = name
- return redirect('/')
- return render_template('edit_category.html', category=category)
- @app.route('/category/<int:category_id>/delete')
- def delete_category(category_id):
- global categories
- categories = [cat for cat in categories if cat["id"] != category_id]
- return redirect('/')
- @app.route('/category/<int:category_id>/fanfic/add', methods=['GET', 'POST'])
- def add_fanfic(category_id):
- category = None
- for cat in categories:
- if cat["id"] == category_id:
- category = cat
- break
- if request.method == 'POST':
- title = request.form.get('title')
- text = request.form.get('text')
- if title and text:
- new_id = max([f["id"] for f in category["fanfics"]]) + 1 if category["fanfics"] else 0
- category["fanfics"].append({
- "id": new_id,
- "title": title,
- "text": text,
- "likes": 0
- })
- return redirect(f'/category/{category_id}')
- return render_template('edit_fanfic.html', category=category)
- @app.route('/category/<int:category_id>/fanfic/<int:fanfic_id>/edit', methods=['GET', 'POST'])
- def edit_fanfic(category_id, fanfic_id):
- category = None
- for cat in categories:
- if cat["id"] == category_id:
- category = cat
- break
- fanfic = None
- for f in category["fanfics"]:
- if f["id"] == fanfic_id:
- fanfic = f
- break
- if request.method == 'POST':
- title = request.form.get('title')
- text = request.form.get('text')
- if title and text:
- fanfic["title"] = title
- fanfic["text"] = text
- return redirect(f'/category/{category_id}')
- return render_template('edit_fanfic.html', category=category, fanfic=fanfic)
- @app.route('/category/<int:category_id>/fanfic/<int:fanfic_id>/delete')
- def delete_fanfic(category_id, fanfic_id):
- category = None
- for cat in categories:
- if cat["id"] == category_id:
- category = cat
- break
- category["fanfics"] = [f for f in category["fanfics"] if f["id"] != fanfic_id]
- return redirect(f'/category/{category_id}')
- if __name__ == '__main__':
- app.run(debug=True)
- templates/index.html
- <!DOCTYPE html>
- <html>
- <head>
- <title>Фанфики</title>
- <style>
- body { font-family: Arial; margin: 40px; }
- .category { border: 2px solid #ccc; padding: 15px; margin: 10px 0; border-radius: 5px; }
- .btn { padding: 8px 15px; margin: 5px; text-decoration: none; border-radius: 3px; }
- .btn-primary { background: #007bff; color: white; }
- .btn-success { background: #28a745; color: white; }
- .btn-danger { background: #dc3545; color: white; }
- .btn-warning { background: #ffc107; color: black; }
- </style>
- </head>
- <body>
- <h1>Фанфики по вселенной Лунтика</h1>
- <a href="/category/add" class="btn btn-success">Добавить категорию</a>
- {% for category in categories %}
- <div class="category">
- <h2>
- <a href="/category/{{ category.id }}">{{ category.name }}</a>
- </h2>
- <p>Фанфиков:{{ category.fanfics|length }}</p>
- <div>
- <a href="/category/{{ category.id }}/edit" class="btn btn-warning">Изменить</a>
- <a href="/category/{{ category.id }}/delete" class="btn btn-danger" onclick="return confirm('Удалить категорию?')">Удалить</a>
- </div>
- </div>
- {% endfor %}
- </body>
- </html>
- templates/category.html
- <!DOCTYPE html>
- <html>
- <head>
- <title>{{ category.name }}</title>
- <style>
- body { font-family: Arial; margin: 40px; }
- .fanfic { border: 1px solid #ddd; padding: 15px; margin: 10px 0; border-radius: 3px; }
- .btn { padding: 5px 10px; margin: 2px; text-decoration: none; border-radius: 3px; font-size: 14px; }
- .btn-primary { background: #007bff; color: white; }
- .btn-success { background: #28a745; color: white; }
- .btn-danger { background: #dc3545; color: white; }
- .btn-warning { background: #ffc107; color: black; }
- .popular { border-left: 4px solid red; }
- </style>
- </head>
- <body>
- <a href="/">К категориям</a>
- <h1>{{ category.name }}</h1>
- <a href="/category/{{ category.id }}/fanfic/add" class="btn btn-success">Добавить фанфик</a>
- {% for fanfic in category.fanfics %}
- <div class="fanfic {% if fanfic.likes > 100 %}popular{% endif %}">
- <h2>{{ fanfic.title }}</h2>
- <p>{{ fanfic.text }}</p>
- <div>
- <a href="/category/{{ category.id }}/fanfic/{{ fanfic.id }}/like" class="btn btn-primary">Лайк{{ fanfic.likes }}</a>
- <a href="/category/{{ category.id }}/fanfic/{{ fanfic.id }}/edit" class="btn btn-warning">Изменить</a>
- <a href="/category/{{ category.id }}/fanfic/{{ fanfic.id }}/delete" class="btn btn-danger" onclick="return confirm('Удалить фанфик?')">Удалить</a>
- </div>
- </div>
- {% endfor %}
- </body>
- </html>
- templates/edit_category.html
- <!DOCTYPE html>
- <html>
- <head>
- <title>{% if category %}Изменить{% else %}Добавить{% endif %} категорию</title>
- <style>
- body { font-family: Arial; margin: 40px; }
- .form-group { margin: 15px 0; }
- input[type="text"] { padding: 8px; width: 300px; }
- .btn { padding: 8px 15px; margin: 5px; text-decoration: none; border-radius: 3px; }
- .btn-primary { background: #007bff; color: white; border: none; }
- .btn-secondary { background: #6c757d; color: white; }
- </style>
- </head>
- <body>
- <h1>{% if category %}Изменить категорию{% else %}Добавить категорию{% endif %}</h1>
- <form method="POST">
- <div class="form-group">
- <label>Название категории:</label><br>
- <input type="text" name="name" value="{{ category.name if category else '' }}" required>
- </div>
- <button type="submit" class="btn btn-primary">Сохранить</button>
- <a href="/" class="btn btn-secondary">Отмена</a>
- </form>
- </body>
- </html>
- templates/edit_fanfic.html
- <!DOCTYPE html>
- <html>
- <head>
- <title>{% if fanfic %}Изменить{% else %}Добавить{% endif %} фанфик</title>
- <style>
- body { font-family: Arial; margin: 40px; }
- .form-group { margin: 15px 0; }
- input[type="text"], textarea { padding: 8px; width: 500px; }
- textarea { height: 200px; }
- .btn { padding: 8px 15px; margin: 5px; text-decoration: none; border-radius: 3px; }
- .btn-primary { background: #007bff; color: white; border: none; }
- .btn-secondary { background: #6c757d; color: white; }
- </style>
- </head>
- <body>
- <h1>{% if fanfic %}Изменить фанфик{% else %}Добавить фанфик в {{ category.name }}{% endif %}</h1>
- <form method="POST">
- <div class="form-group">
- <label>Название:</label><br>
- <input type="text" name="title" value="{{ fanfic.title if fanfic else '' }}" required>
- </div>
- <div class="form-group">
- <label>Текст:</label><br>
- <textarea name="text" required>{{ fanfic.text if fanfic else '' }}</textarea>
- </div>
- <button type="submit" class="btn btn-primary">Сохранить</button>
- <a href="/category/{{ category.id }}" class="btn btn-secondary">Отмена</a>
- </form>
- </body>
- </html>
Add Comment
Please, Sign In to add comment