Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //main.py
- from flask import Flask
- from views import api
- def create_app():
- app = Flask(__name__)
- app.register_blueprint(api, url_prefix='/')
- return app
- if __name__ == '__main__':
- app = create_app()
- app.run(host='127.0.0.1', port=5000, debug=True)
- //---------------------------------------------------------------------------
- //views.py
- from flask import Blueprint, request, jsonify
- from data import (
- get_all_tasks, get_task_by_id, add_task, update_task, delete_task,
- get_tasks_by_status, get_stats
- )
- api = Blueprint('api', __name__)
- @api.route('/tasks', methods=['GET'])
- def list_tasks():
- """Получить все задачи. Можно фильтровать по статусу."""
- status_filter = request.args.get('status')
- if status_filter:
- tasks = get_tasks_by_status(status_filter)
- else:
- tasks = get_all_tasks()
- return jsonify(tasks)
- @api.route('/tasks', methods=['POST'])
- def create_task():
- """Создать новую задачу."""
- data = request.get_json()
- if not data or 'title' not in data or not data['title'].strip():
- return jsonify({'error': 'Поле "title" обязательно и не может быть пустым'}), 400
- title = data['title']
- description = data.get('description')
- status = data.get('status', 'pending')
- if status not in ['pending', 'done']:
- return jsonify({'error': 'Некорректное значение статуса. Допустимые значения: "pending", "done"'}), 400
- new_task = add_task(title, description, status)
- return jsonify(new_task), 201
- @api.route('/tasks/<int:task_id>', methods=['GET'])
- def get_task(task_id):
- """Получить задачу по ID."""
- task = get_task_by_id(task_id)
- if not task:
- return jsonify({'error': 'Задача не найдена'}), 404
- return jsonify(task)
- @api.route('/tasks/<int:task_id>', methods=['PUT'])
- def update_task_route(task_id):
- """Обновить задачу по ID."""
- data = request.get_json()
- if not data:
- return jsonify({'error': 'Тело запроса не может быть пустым'}), 400
- title = data.get('title')
- description = data.get('description')
- status = data.get('status')
- if status and status not in ['pending', 'done']:
- return jsonify({'error': 'Некорректное значение статуса. Допустимые значения: "pending", "done"'}), 400
- updated_task = update_task(task_id, title, description, status)
- if not updated_task:
- return jsonify({'error': 'Задача не найдена'}), 404
- return jsonify(updated_task)
- @api.route('/tasks/<int:task_id>', methods=['DELETE'])
- def delete_task_route(task_id):
- """Удалить задачу по ID."""
- if not delete_task(task_id):
- return jsonify({'error': 'Задача не найдена'}), 404
- return jsonify({'message': 'Задача успешно удалена'}), 200
- @api.route('/tasks/stats', methods=['GET'])
- def stats():
- """Получить статистику по статусам задач."""
- stats_data = get_stats()
- return jsonify(stats_data)
- //---------------------------------------------------------------------------
- //data.py
- tasks = []
- next_id = 1
- def get_all_tasks():
- return tasks.copy()
- def get_task_by_id(task_id):
- for task in tasks:
- if task['id'] == task_id:
- return task
- return None
- def add_task(title, description=None, status="pending"):
- global next_id
- new_task = {
- 'id': next_id,
- 'title': title.strip(),
- 'description': description.strip() if description else None,
- 'status': status
- }
- tasks.append(new_task)
- next_id += 1
- return new_task
- def update_task(task_id, title=None, description=None, status=None):
- task = get_task_by_id(task_id)
- if not task:
- return None
- if title is not None:
- task['title'] = title.strip()
- if description is not None:
- task['description'] = description.strip() if description else None
- if status is not None:
- task['status'] = status
- return task
- def delete_task(task_id):
- global tasks
- task = get_task_by_id(task_id)
- if not task:
- return False
- tasks = [t for t in tasks if t['id'] != task_id]
- return True
- def get_tasks_by_status(status):
- return [task for task in tasks if task['status'] == status]
- def get_stats():
- done_count = len(get_tasks_by_status("done"))
- pending_count = len(get_tasks_by_status("pending"))
- return {
- "done": done_count,
- "pending": pending_count
- }
- //---------------------------------------------------------------------------
- //test_api.py
- import requests
- base_url = 'http://localhost:5000/tasks'
- # 1. Добавление задачи
- print("1. Добавляем задачу...")
- task1 = {"title": "Buy milk", "description": "Get whole milk from supermarket", "status": "pending"}
- resp = requests.post(base_url, json=task1)
- print("POST /tasks:", resp.status_code, resp.json())
- task_id1 = resp.json().get('id')
- # 2. Получение всех задач
- print("\n2. Получаем все задачи...")
- resp = requests.get(base_url)
- print("GET /tasks:", resp.status_code, resp.json())
- # 3. Получение задачи по ID
- print(f"\n3. Получаем задачу с ID {task_id1}...")
- resp = requests.get(f"{base_url}/{task_id1}")
- print(f"GET /tasks/{task_id1}:", resp.status_code, resp.json())
- # 4. Обновление задачи
- print(f"\n4. Обновляем задачу {task_id1}...")
- update_data = {"title": "Buy organic milk", "status": "done"}
- resp = requests.put(f"{base_url}/{task_id1}", json=update_data)
- print(f"PUT /tasks/{task_id1}:", resp.status_code, resp.json())
- # 5. Фильтрация по статусу
- print("\n5. Получаем задачи со статусом 'done'...")
- resp = requests.get(f"{base_url}?status=done")
- print("GET /tasks?status=done:", resp.status_code, resp.json())
- # 6. Статистика
- print("\n6. Получаем статистику...")
- resp = requests.get(f"{base_url}/stats")
- print("GET /tasks/stats:", resp.status_code, resp.json())
- # 7. Удаление задачи
- print(f"\n7. Удаляем задачу {task_id1}...")
- resp = requests.delete(f"{base_url}/{task_id1}")
- print(f"DELETE /tasks/{task_id1}:", resp.status_code, resp.json())
- # 8. Проверка, что задача удалена
- print(f"\n8. Проверяем, что задача {task_id1} больше не существует...")
- resp = requests.get(f"{base_url}/{task_id1}")
- print(f"GET /tasks/{task_id1} (после удаления):", resp.status_code, resp.json())
Advertisement
Add Comment
Please, Sign In to add comment