RESTful API - nemopss/mpt-kpi GitHub Wiki
В данной папке размещены файлы, отвечающие за создание RESTful API ресурсов с использованием Flask-RESTful. Каждый файл реализует определённый ресурс и обрабатывает запросы к ним, включая операции получения, обновления и создания данных.
Данный файл определяет класс BasicResource, который наследуется от Resource из библиотеки Flask-RESTful.
from flask_restful import Resource, reqparse
docs = {}
class BasicResource(Resource):
def get(self, source_id: int) -> dict:
return {source_id: docs.get(source_id)}
# FOR UPDATE
def put(self, source_id: int):
docs[source_id] = source_id
return {source_id: source_id}
# FOR CREATE
def post(self, source_id: int):
docs[source_id] = source_id
return {source_id: source_id}, 201
Данный файл предоставляет три основных метода для обработки HTTP-запросов:
• get(self, source_id: int) -> dict: Метод, который получает данные по source_id. Если данные не найдены, возвращает None.
• put(self, source_id: int): Метод веб-API для обновления данных. Принимает source_id, обновляет данные в словаре docs, и возвращает обновлённые данные.
• post(self, source_id: int): Метод для создания новой записи. Принимает source_id, добавляет его в словарь docs, и возвращает созданные данные с кодом ответа 201 (Created).
Файл содержит класс CertificatesResource, который также наследуется от Resource. Основная задача этого ресурса — предоставление информации о сертификатах.
from flask_restful import Resource, reqparse
from services.certificates_generator import Certificate, certificates_list
class CertificatesResource(Resource):
def get(self) -> dict:
return [certificate._asdict() for certificate in certificates_list]
• get(self) -> dict: Метод для получения списка сертификатов. Он возвращает список сертификатов в виде словарей, используя вспомогательную функцию _asdict() для преобразования объекта сертификата в словарь. Данные сертификатов поступают из certificates_list.
Файл описывает класс CriteriesResource, который отвечает за предоставление данных о критериях.
from flask_restful import Resource, reqparse
from services.criteries_generator import Criterion, criteries_list
class CriteriesResource(Resource):
def get(self) -> dict:
return [criterion._asdict() for criterion in criteries_list]
• get(self) -> dict: Метод для получения списка критериев. Он возвращает список объектов Criterion, преобразованных в словари с помощью метода _asdict(). Данные критериев поступают из criteries_list.
Файл содержит класс EmployeesResource, который реализует управление данными сотрудников.
from flask_restful import Resource, reqparse
from flask import request
from services.employees_generator import Employee, employees_list
# parser = reqparse.RequestParser()
# (
# parser.add_argument(argument) for argument in
# 'id first_name last_name surname job_id phone email'.split()
# )
class EmployeesResource(Resource):
def get(self) -> dict:
return [employee._asdict() for employee in employees_list]
def post(self) -> dict:
args = request.json
#args = parser.parse_args()
print(args)
employee = Employee(
id=args['id'],
first_name=args['first_name'],
last_name=args['last_name'],
surname=args['surname'],
job_id=args['job_id'],
phone=args['phone'],
email=args['email'],
)
employees_list.append(employee)
return employees_list[-1]._asdict()
• get(self) -> dict: Метод для получения списка всех сотрудников. Возвращает список сотрудников, преобразованных в словари с помощью метода /_asdict().
• post(self) -> dict: Метод для добавления нового сотрудника. Он извлекает данные из JSON тела запроса, создает новый объект Employee и добавляет его в список. Возвращает данные последнего добавленного сотрудника в виде словаря.
Файл реализует класс PDFResource, обеспечивающий функциональность работы с PDF файлами и другими поддерживаемыми форматами.
import os
from werkzeug.utils import secure_filename
from flask_restful import Resource, abort
from flask import request, send_from_directory
ALLOWED_EXTENSIONS = ['pdf', 'doc', 'docx', 'png']
def find_local_file(target_name) -> bool:
print(target_name)
for (root, folder, file_name) in os.walk('docs'):
if len(file_name) == 0: return False
if target_name in file_name: return True
return False
def validate_extension(file_ext) -> bool:
for ext in ALLOWED_EXTENSIONS:
if file_ext == ext: return True
return False
def build_name(file_name, file_ext) -> str: return file_name + '.' + file_ext
class PDFResource(Resource):
def post(self):
file = request.files.get('image')
print(file.filename)
save_filename, save_ext = secure_filename(file.filename).split('.')
if not validate_extension(save_ext): abort(415)
if find_local_file(file.filename):
save_filename += '_copy'
save_filename = build_name(save_filename, save_ext)
file.save(dst="docs/"+secure_filename(save_filename))
return {'file': 'saved:OK'}, 201
def get(self, filename):
if find_local_file(filename):
print(f'FOUND {filename}')
# Возвращает файл, который открывается в браузере
# На фронте можно просто дать ссылку на docs/<имя файла>
# <a href="docs/filo.pdf">File link</a>, должно работать
return send_from_directory('docs', secure_filename(filename))
else:
abort(404)
def delete(self, filename):
try:
os.remove(os.path.join('docs', secure_filename(filename)))
return {'file': 'deleted:OK'}, 200
except WindowsError as e:
print(e)
abort(404)
• post(self): Метод для загрузки файлов. Он извлекает файл из запроса, проверяет его расширение и наличие в локальной директории. Если файл с таким именем уже существует, добавляет суффикс _copy. Файл сохраняется в папку docs и возвращается статус 201 Created.
• get(self, filename): Метод для получения файла по имени. Он проверяет наличие файла в директории docs и возвращает его, если файл найден. В противном случае возвращает статус 404 Not Found.
• delete(self, filename): Метод для удаления файла. Он удаляет указанный файл из директории docs. Если файл не найден, возвращает статус 404 Not Found.