/
liquid-g
/
liquid-code
Обзор
Документация
Войти
/
liquid-g
/
liquid-code
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/liquidcode/middleware/cors.py
71 строка
3 KB
User
ci: настроен Black и flake8 для автоматического форматирования кода
04 июл 2026, 08:14
04 июл 2026, 08:14
4778ed6
Код
Авторство
О чём код?
""" Middleware для добавления CORS-заголовков. """ from typing import Any, Callable from ..contracts import Request, Response from ..http import HttpResponse from .base import Middleware class CORSMiddleware(Middleware): """ Добавляет CORS-заголовки к ответу. """ def __init__( self, allow_origin: str = "*", allow_methods: str = "GET, POST, PUT, PATCH, DELETE, OPTIONS", allow_headers: str = "Content-Type, Authorization, X-Requested-With", allow_credentials: bool = True, ): self.allow_origin = allow_origin self.allow_methods = allow_methods self.allow_headers = allow_headers self.allow_credentials = allow_credentials def __call__( self, request: Request, call_next: Callable[[Request], Response] ) -> Response: # Если это preflight-запрос (OPTIONS), возвращаем сразу с заголовками if request.get_method() == "OPTIONS": return self._preflight_response() # Вызываем следующий middleware/контроллер response = call_next(request) # Добавляем CORS-заголовки к ответу return self._add_headers(response) def _preflight_response(self) -> Response: """Возвращает ответ на OPTIONS-запрос.""" headers = { "Access-Control-Allow-Origin": self.allow_origin, "Access-Control-Allow-Methods": self.allow_methods, "Access-Control-Allow-Headers": self.allow_headers, "Access-Control-Allow-Credentials": ( "true" if self.allow_credentials else "false" ), } return HttpResponse(content={}, status=200, headers=headers) def _add_headers(self, response: Response) -> Response: """Добавляет CORS-заголовки к существующему ответу.""" # Копируем существующие заголовки headers = response.get_headers().copy() headers.update( { "Access-Control-Allow-Origin": self.allow_origin, "Access-Control-Allow-Credentials": ( "true" if self.allow_credentials else "false" ), } ) # Создаём новый HttpResponse с теми же данными, но обновлёнными заголовками return HttpResponse( content=response.get_content(), status=response.get_status(), headers=headers, )