Teammasik

pythonDev/lr10

Dec 7th, 2025
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.86 KB | Software | 0 0
  1. //main.py
  2. from flask import Flask
  3. from views import api
  4.  
  5. def create_app():
  6.     app = Flask(__name__)
  7.     app.register_blueprint(api, url_prefix='/')
  8.     return app
  9.  
  10. if __name__ == '__main__':
  11.     app = create_app()
  12.     app.run(host='127.0.0.1', port=5000, debug=True)
  13.    
  14.  
  15. //---------------------------------------------------------------------------
  16. //views.py
  17. from flask import Blueprint, request, jsonify
  18. from data import (
  19.     get_all_tasks, get_task_by_id, add_task, update_task, delete_task,
  20.     get_tasks_by_status, get_stats
  21. )
  22.  
  23. api = Blueprint('api', __name__)
  24.  
  25. @api.route('/tasks', methods=['GET'])
  26. def list_tasks():
  27.     """Получить все задачи. Можно фильтровать по статусу."""
  28.     status_filter = request.args.get('status')
  29.     if status_filter:
  30.         tasks = get_tasks_by_status(status_filter)
  31.     else:
  32.         tasks = get_all_tasks()
  33.     return jsonify(tasks)
  34.  
  35. @api.route('/tasks', methods=['POST'])
  36. def create_task():
  37.     """Создать новую задачу."""
  38.     data = request.get_json()
  39.     if not data or 'title' not in data or not data['title'].strip():
  40.         return jsonify({'error': 'Поле "title" обязательно и не может быть пустым'}), 400
  41.  
  42.     title = data['title']
  43.     description = data.get('description')
  44.     status = data.get('status', 'pending')
  45.  
  46.     if status not in ['pending', 'done']:
  47.         return jsonify({'error': 'Некорректное значение статуса. Допустимые значения: "pending", "done"'}), 400
  48.  
  49.     new_task = add_task(title, description, status)
  50.     return jsonify(new_task), 201
  51.  
  52. @api.route('/tasks/<int:task_id>', methods=['GET'])
  53. def get_task(task_id):
  54.     """Получить задачу по ID."""
  55.     task = get_task_by_id(task_id)
  56.     if not task:
  57.         return jsonify({'error': 'Задача не найдена'}), 404
  58.     return jsonify(task)
  59.  
  60. @api.route('/tasks/<int:task_id>', methods=['PUT'])
  61. def update_task_route(task_id):
  62.     """Обновить задачу по ID."""
  63.     data = request.get_json()
  64.     if not data:
  65.         return jsonify({'error': 'Тело запроса не может быть пустым'}), 400
  66.  
  67.     title = data.get('title')
  68.     description = data.get('description')
  69.     status = data.get('status')
  70.  
  71.     if status and status not in ['pending', 'done']:
  72.         return jsonify({'error': 'Некорректное значение статуса. Допустимые значения: "pending", "done"'}), 400
  73.  
  74.     updated_task = update_task(task_id, title, description, status)
  75.     if not updated_task:
  76.         return jsonify({'error': 'Задача не найдена'}), 404
  77.  
  78.     return jsonify(updated_task)
  79.  
  80. @api.route('/tasks/<int:task_id>', methods=['DELETE'])
  81. def delete_task_route(task_id):
  82.     """Удалить задачу по ID."""
  83.     if not delete_task(task_id):
  84.         return jsonify({'error': 'Задача не найдена'}), 404
  85.     return jsonify({'message': 'Задача успешно удалена'}), 200
  86.  
  87. @api.route('/tasks/stats', methods=['GET'])
  88. def stats():
  89.     """Получить статистику по статусам задач."""
  90.     stats_data = get_stats()
  91.     return jsonify(stats_data)
  92.  
  93.  
  94. //---------------------------------------------------------------------------
  95. //data.py
  96. tasks = []
  97. next_id = 1
  98.  
  99. def get_all_tasks():
  100.     return tasks.copy()
  101.  
  102. def get_task_by_id(task_id):
  103.     for task in tasks:
  104.         if task['id'] == task_id:
  105.             return task
  106.     return None
  107.  
  108. def add_task(title, description=None, status="pending"):
  109.     global next_id
  110.     new_task = {
  111.         'id': next_id,
  112.         'title': title.strip(),
  113.         'description': description.strip() if description else None,
  114.         'status': status
  115.     }
  116.     tasks.append(new_task)
  117.     next_id += 1
  118.     return new_task
  119.  
  120. def update_task(task_id, title=None, description=None, status=None):
  121.     task = get_task_by_id(task_id)
  122.     if not task:
  123.         return None
  124.  
  125.     if title is not None:
  126.         task['title'] = title.strip()
  127.     if description is not None:
  128.         task['description'] = description.strip() if description else None
  129.     if status is not None:
  130.         task['status'] = status
  131.     return task
  132.  
  133. def delete_task(task_id):
  134.     global tasks
  135.     task = get_task_by_id(task_id)
  136.     if not task:
  137.         return False
  138.     tasks = [t for t in tasks if t['id'] != task_id]
  139.     return True
  140.  
  141. def get_tasks_by_status(status):
  142.     return [task for task in tasks if task['status'] == status]
  143.  
  144. def get_stats():
  145.     done_count = len(get_tasks_by_status("done"))
  146.     pending_count = len(get_tasks_by_status("pending"))
  147.     return {
  148.         "done": done_count,
  149.         "pending": pending_count
  150.     }
  151.  
  152. //---------------------------------------------------------------------------
  153. //test_api.py
  154. import requests
  155.  
  156. base_url = 'http://localhost:5000/tasks'
  157.  
  158. # 1. Добавление задачи
  159. print("1. Добавляем задачу...")
  160. task1 = {"title": "Buy milk", "description": "Get whole milk from supermarket", "status": "pending"}
  161. resp = requests.post(base_url, json=task1)
  162. print("POST /tasks:", resp.status_code, resp.json())
  163. task_id1 = resp.json().get('id')
  164.  
  165. # 2. Получение всех задач
  166. print("\n2. Получаем все задачи...")
  167. resp = requests.get(base_url)
  168. print("GET /tasks:", resp.status_code, resp.json())
  169.  
  170. # 3. Получение задачи по ID
  171. print(f"\n3. Получаем задачу с ID {task_id1}...")
  172. resp = requests.get(f"{base_url}/{task_id1}")
  173. print(f"GET /tasks/{task_id1}:", resp.status_code, resp.json())
  174.  
  175. # 4. Обновление задачи
  176. print(f"\n4. Обновляем задачу {task_id1}...")
  177. update_data = {"title": "Buy organic milk", "status": "done"}
  178. resp = requests.put(f"{base_url}/{task_id1}", json=update_data)
  179. print(f"PUT /tasks/{task_id1}:", resp.status_code, resp.json())
  180.  
  181. # 5. Фильтрация по статусу
  182. print("\n5. Получаем задачи со статусом 'done'...")
  183. resp = requests.get(f"{base_url}?status=done")
  184. print("GET /tasks?status=done:", resp.status_code, resp.json())
  185.  
  186. # 6. Статистика
  187. print("\n6. Получаем статистику...")
  188. resp = requests.get(f"{base_url}/stats")
  189. print("GET /tasks/stats:", resp.status_code, resp.json())
  190.  
  191. # 7. Удаление задачи
  192. print(f"\n7. Удаляем задачу {task_id1}...")
  193. resp = requests.delete(f"{base_url}/{task_id1}")
  194. print(f"DELETE /tasks/{task_id1}:", resp.status_code, resp.json())
  195.  
  196. # 8. Проверка, что задача удалена
  197. print(f"\n8. Проверяем, что задача {task_id1} больше не существует...")
  198. resp = requests.get(f"{base_url}/{task_id1}")
  199. print(f"GET /tasks/{task_id1} (после удаления):", resp.status_code, resp.json())
  200.  
Advertisement
Add Comment
Please, Sign In to add comment