Spaces:
Running
Running
feat: data processing remix ve analysis backend routes ile rate limiting ve istemci IP servisleri eklendi
Browse files- app/routes/analyze.py +1 -14
- app/routes/dreams.py +2 -1
app/routes/analyze.py
CHANGED
|
@@ -90,6 +90,7 @@ from ..services.inference_xai import get_xai_service
|
|
| 90 |
from ..services.meta_classifier import MetaClassifierService, MODEL_VERSION_TRAINED
|
| 91 |
from ..services.url_parser import parse_youtube_url
|
| 92 |
from ..services.youtube_downloader import YouTubeDownloadError, YouTubeDownloader
|
|
|
|
| 93 |
from ..services.logging_config import get_logger
|
| 94 |
|
| 95 |
router = APIRouter()
|
|
@@ -119,20 +120,6 @@ _ANALYZE_RATE_MAX = 20 # requests per minute per IP
|
|
| 119 |
_ANALYZE_MAX_IPS = 10_000
|
| 120 |
|
| 121 |
|
| 122 |
-
def _client_ip(request: Request) -> str:
|
| 123 |
-
"""The visitor's address behind the Hugging Face proxy.
|
| 124 |
-
|
| 125 |
-
uvicorn sees the proxy, so request.client alone would put every
|
| 126 |
-
visitor in one bucket; the proxy lists the original client first
|
| 127 |
-
in X-Forwarded-For.
|
| 128 |
-
"""
|
| 129 |
-
forwarded = request.headers.get("x-forwarded-for", "")
|
| 130 |
-
first = forwarded.split(",")[0].strip()
|
| 131 |
-
if first:
|
| 132 |
-
return first
|
| 133 |
-
return request.client.host if request.client else "unknown"
|
| 134 |
-
|
| 135 |
-
|
| 136 |
async def _analyze_rate_limit(request: Request) -> None:
|
| 137 |
"""Rate limit for analysis endpoints."""
|
| 138 |
client_ip = _client_ip(request)
|
|
|
|
| 90 |
from ..services.meta_classifier import MetaClassifierService, MODEL_VERSION_TRAINED
|
| 91 |
from ..services.url_parser import parse_youtube_url
|
| 92 |
from ..services.youtube_downloader import YouTubeDownloadError, YouTubeDownloader
|
| 93 |
+
from ..services.client_ip import client_ip as _client_ip
|
| 94 |
from ..services.logging_config import get_logger
|
| 95 |
|
| 96 |
router = APIRouter()
|
|
|
|
| 120 |
_ANALYZE_MAX_IPS = 10_000
|
| 121 |
|
| 122 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 123 |
async def _analyze_rate_limit(request: Request) -> None:
|
| 124 |
"""Rate limit for analysis endpoints."""
|
| 125 |
client_ip = _client_ip(request)
|
app/routes/dreams.py
CHANGED
|
@@ -11,6 +11,7 @@ from fastapi import APIRouter, Depends, HTTPException, Request, status
|
|
| 11 |
|
| 12 |
from app.schemas import DreamAnalysisRequest, DreamAnalysisResponse
|
| 13 |
from app.services.dream_analyzer import analyze_dream
|
|
|
|
| 14 |
from app.services.logging_config import get_logger
|
| 15 |
|
| 16 |
router = APIRouter(prefix="/api/dreams", tags=["Dreams"])
|
|
@@ -26,7 +27,7 @@ _MAX_TRACKED_IPS = 10_000
|
|
| 26 |
|
| 27 |
|
| 28 |
async def _rate_limit(request: Request) -> None:
|
| 29 |
-
client_ip = request
|
| 30 |
now = time.time()
|
| 31 |
cutoff = now - _RATE_WINDOW
|
| 32 |
|
|
|
|
| 11 |
|
| 12 |
from app.schemas import DreamAnalysisRequest, DreamAnalysisResponse
|
| 13 |
from app.services.dream_analyzer import analyze_dream
|
| 14 |
+
from app.services.client_ip import client_ip as _client_ip
|
| 15 |
from app.services.logging_config import get_logger
|
| 16 |
|
| 17 |
router = APIRouter(prefix="/api/dreams", tags=["Dreams"])
|
|
|
|
| 27 |
|
| 28 |
|
| 29 |
async def _rate_limit(request: Request) -> None:
|
| 30 |
+
client_ip = _client_ip(request)
|
| 31 |
now = time.time()
|
| 32 |
cutoff = now - _RATE_WINDOW
|
| 33 |
|