import re from backend.core.response_types import * from backend.core.utils import NOT_FOUND_CODE class ResolutionError(Exception): pass class Route: """ Представляет из себя класс роута. При инициализации принимает допустимые методы и регулярное выражение. Содержит методы для работы роутинга. Чтобы созданный путь стал обрабатываться необходимо поместить объект Route в таблицу роутера. """ def __init__(self, callback, url_format, methods=None): self.methods = ['GET'] if methods is None else methods self.url_pattern = re.compile(url_format) self.callback = callback def resolve(self, url, method, query): match = self.url_pattern.fullmatch(url) if match is not None: groups = match.groups() matched = len(groups) == self.url_pattern.groups and method in self.methods if not matched: raise ResolutionError() else: raise ResolutionError() return self.callback(query, *match.groups()) def run(request) -> Response: response = ErrorResponse(NOT_FOUND_CODE) method, url = request['method'], request['url'] for route in router_table: try: response = route.resolve(url, method, request['query']) except ResolutionError: continue return response router_table = []