feat: rate limiting
Python Lint CI / ruff-format-check (push) Successful in 44s
Python Lint CI / ty (push) Successful in 44s
Python Lint CI / ruff (push) Successful in 44s

This commit is contained in:
2026-07-03 15:33:06 +02:00
parent 92d2e7c3a0
commit 59a6f49700
6 changed files with 151 additions and 7 deletions
+1 -1
View File
@@ -14,7 +14,7 @@ class Database:
self.env = params.env
self.logger = logging.getLogger(self.__class__.__name__)
self.config = tortoise.config.TortoiseConfig(
connections={"default": tortoise.config.DBUrlConfig(params.db_url)},
connections={"default": tortoise.config.DBUrlConfig(params.db_uri)},
apps={
"models": tortoise.config.AppConfig(
models=["app.models"],
+13 -5
View File
@@ -15,7 +15,8 @@ class Parameters:
port: int = 5000
workers: int = 4
timeout: int = 120
db_url: str = "postgres://postgres:5432/tout-doux"
db_uri: str = "postgres://localhost:5432/tout-doux"
cache_uri: str = "redis://localhost:6379"
@classmethod
def from_namespace(cls, args: argparse.Namespace) -> Parameters:
@@ -115,10 +116,17 @@ def parse_parameters(args: typing.Sequence[str]) -> Parameters:
)
__add_arg_str(
parser,
"--db-url",
env_var="DB_URL",
default=default_values.db_url,
help_txt="database connection url",
"--db-uri",
env_var="DB_URI",
default=default_values.db_uri,
help_txt="database connection URI",
)
__add_arg_str(
parser,
"--cache-uri",
env_var="CACHE_URI",
default=default_values.cache_uri,
help_txt="cache connection URI",
)
parsed_args = parser.parse_args(args)
return Parameters.from_namespace(parsed_args)
+9
View File
@@ -2,6 +2,8 @@ import logging
import typing
import flask
import flask_limiter
import flask_limiter.util
import gunicorn.app.base
from app import PKG_NAME
@@ -22,12 +24,19 @@ class Server(gunicorn.app.base.BaseApplication):
self.app = flask.Flask(
PKG_NAME, static_folder="dist/assets", template_folder="dist"
)
self.limiter = flask_limiter.Limiter(
flask_limiter.util.get_remote_address,
app=self.app,
default_limits=["100 per minute"],
storage_uri=params.cache_uri,
)
self._index_content: str | None = None
self.logger: logging.Logger = logging.getLogger(self.__class__.__name__)
super().__init__()
def register_routes(self) -> typing.Self:
@self.app.route("/")
@self.limiter.exempt
def index() -> str:
return flask.render_template("index.html")