fix: Update max-line-length in .flake8 and refactor routing and server code for improved readability and functionality

This commit is contained in:
Илья Глазунов 2025-09-02 14:23:01 +03:00
parent 84cd1c974f
commit 6b157d7626
3 changed files with 113 additions and 93 deletions

View File

@ -1,4 +1,4 @@
[flake8] [flake8]
max-line-length = 100 max-line-length = 120
exclude = __pycache__,.git,.venv,venv,build,dist exclude = __pycache__,.git,.venv,venv,build,dist
ignore = E203,W503 ignore = E203,W503

View File

@ -8,11 +8,13 @@ from .logging_utils import get_logger
logger = get_logger(__name__) logger = get_logger(__name__)
class RouteMatch: class RouteMatch:
def __init__(self, config: Dict[str, Any], params: Optional[Dict[str, str]] = None): def __init__(self, config: Dict[str, Any], params: Optional[Dict[str, str]] = None):
self.config = config self.config = config
self.params = params or {} self.params = params or {}
class Router: class Router:
def __init__(self, static_dir: str = "./static"): def __init__(self, static_dir: str = "./static"):
self.static_dir = Path(static_dir) self.static_dir = Path(static_dir)
@ -82,7 +84,8 @@ class RequestHandler:
async def _process_route(self, request: Request, route_match: RouteMatch) -> Response: async def _process_route(self, request: Request, route_match: RouteMatch) -> Response:
config = route_match.config config = route_match.config
path = request.url.path # HINT: Not using it right now
# path = request.url.path
if "return" in config: if "return" in config:
status_text = config["return"] status_text = config["return"]

View File

@ -4,8 +4,8 @@ import time
from starlette.applications import Starlette from starlette.applications import Starlette
from starlette.requests import Request from starlette.requests import Request
from starlette.responses import Response, PlainTextResponse from starlette.responses import Response, PlainTextResponse
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.routing import Route from starlette.routing import Route
from starlette.types import ASGIApp, Receive, Scope, Send
from pathlib import Path from pathlib import Path
from typing import Optional, Dict, Any from typing import Optional, Dict, Any
@ -17,22 +17,28 @@ from . import __version__
logger = get_logger(__name__) logger = get_logger(__name__)
class PyServeMiddleware(BaseHTTPMiddleware): class PyServeMiddleware:
def __init__(self, app, extension_manager: ExtensionManager): def __init__(self, app: ASGIApp, extension_manager: ExtensionManager):
super().__init__(app) self.app = app
self.extension_manager = extension_manager self.extension_manager = extension_manager
self.access_logger = get_logger('pyserve.access') self.access_logger = get_logger('pyserve.access')
async def dispatch(self, request: Request, call_next): async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
if scope["type"] != "http":
await self.app(scope, receive, send)
return
start_time = time.time() start_time = time.time()
request = Request(scope, receive)
response = await self.extension_manager.process_request(request) response = await self.extension_manager.process_request(request)
if response is None: if response is None:
response = await call_next(request) await self.app(scope, receive, send)
return
response = await self.extension_manager.process_response(request, response) response = await self.extension_manager.process_response(request, response)
response.headers["Server"] = f"pyserve/{__version__}" response.headers["Server"] = f"pyserve/{__version__}"
client_ip = request.client.host if request.client else "unknown" client_ip = request.client.host if request.client else "unknown"
method = request.method method = request.method
path = str(request.url.path) path = str(request.url.path)
@ -44,7 +50,7 @@ class PyServeMiddleware(BaseHTTPMiddleware):
self.access_logger.info(f"{client_ip} - {method} {path} - {status_code} - {process_time}ms") self.access_logger.info(f"{client_ip} - {method} {path} - {status_code} - {process_time}ms")
return response await response(scope, receive, send)
class PyServeServer: class PyServeServer:
@ -58,7 +64,7 @@ class PyServeServer:
def _setup_logging(self) -> None: def _setup_logging(self) -> None:
self.config.setup_logging() self.config.setup_logging()
logger.info("PyServe сервер инициализирован") logger.info("PyServe server initialized")
def _load_extensions(self) -> None: def _load_extensions(self) -> None:
for ext_config in self.config.extensions: for ext_config in self.config.extensions:
@ -71,7 +77,18 @@ class PyServeServer:
routes = [ routes = [
Route("/health", self._health_check, methods=["GET"]), Route("/health", self._health_check, methods=["GET"]),
Route("/metrics", self._metrics, methods=["GET"]), Route("/metrics", self._metrics, methods=["GET"]),
Route("/{path:path}", self._catch_all, methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"]), Route(
"/{path:path}",
self._catch_all,
methods=[
"GET",
"POST",
"PUT",
"DELETE",
"PATCH",
"OPTIONS"
]
),
] ]
self.app = Starlette(routes=routes) self.app = Starlette(routes=routes)
@ -132,8 +149,7 @@ class PyServeServer:
self._ensure_directories() self._ensure_directories()
ssl_context = self._create_ssl_context() ssl_context = self._create_ssl_context()
uvicorn_config = { uvicorn_config: Dict[str, Any] = {
"app": self.app,
"host": self.config.server.host, "host": self.config.server.host,
"port": self.config.server.port, "port": self.config.server.port,
"log_level": "critical", "log_level": "critical",
@ -154,7 +170,8 @@ class PyServeServer:
logger.info(f"Starting PyServe server at {protocol}://{self.config.server.host}:{self.config.server.port}") logger.info(f"Starting PyServe server at {protocol}://{self.config.server.host}:{self.config.server.port}")
try: try:
uvicorn.run(**uvicorn_config) assert self.app is not None, "App not initialized"
uvicorn.run(self.app, **uvicorn_config)
except KeyboardInterrupt: except KeyboardInterrupt:
logger.info("Received shutdown signal") logger.info("Received shutdown signal")
except Exception as e: except Exception as e: