RESTful API - nemopss/mpt-kpi GitHub Wiki

1.4.2 resources

В данной папке размещены файлы, отвечающие за создание RESTful API ресурсов с использованием Flask-RESTful. Каждый файл реализует определённый ресурс и обрабатывает запросы к ним, включая операции получения, обновления и создания данных.

1.4.2.1 basic_resource.py

Данный файл определяет класс 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).

1.4.2.2 certificates_resource.py

Файл содержит класс 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.

1.4.2.3 criteries_resource.py

Файл описывает класс 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.

1.4.2.4 employees_resource.py

Файл содержит класс 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 и добавляет его в список. Возвращает данные последнего добавленного сотрудника в виде словаря.

1.4.2.5 pdf_resource.py

Файл реализует класс 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.

⚠️ **GitHub.com Fallback** ⚠️