|
1 | 1 | from pathlib import Path
|
2 | 2 | from flask import Flask, jsonify, session
|
3 | 3 | from flask_mail import Mail
|
| 4 | +from flask_limiter import Limiter |
| 5 | +from flask_limiter.util import get_remote_address |
4 | 6 | import os
|
5 | 7 | import secrets
|
6 | 8 |
|
|
19 | 21 | app = Flask(__name__)
|
20 | 22 | mail = Mail(app)
|
21 | 23 |
|
| 24 | + |
| 25 | +def build_valkey_uri(): |
| 26 | + host = os.getenv("DB_HOST", "127.0.0.1") |
| 27 | + port = os.getenv("DB_PORT", 6379) |
| 28 | + password = os.getenv("DB_PASSWORD") |
| 29 | + ssl = False if os.getenv("DB_USE_SSL") == "false" else True |
| 30 | + scheme = "rediss" if ssl else "redis" |
| 31 | + |
| 32 | + if password: |
| 33 | + return f"{scheme}://:{password}@{host}:{port}" |
| 34 | + return f"{scheme}://{host}:{port}" |
| 35 | + |
| 36 | + |
| 37 | +limiter = Limiter( |
| 38 | + get_remote_address, |
| 39 | + app=app, |
| 40 | + storage_uri=build_valkey_uri(), |
| 41 | +) |
| 42 | + |
22 | 43 | # Configure Flask sessions
|
23 | 44 | app.secret_key = os.getenv("FLASK_SECRET_KEY", secrets.token_hex(32))
|
24 | 45 | app.config["SESSION_COOKIE_HTTPONLY"] = True
|
@@ -66,10 +87,16 @@ def clear_session():
|
66 | 87 | "/api/citation", endpoint="citation", view_func=get_citation, methods=["GET"]
|
67 | 88 | )
|
68 | 89 |
|
| 90 | + |
| 91 | +@limiter.limit("3 per minute") |
| 92 | +def feedback_route(): |
| 93 | + return send_feedback(mail) |
| 94 | + |
| 95 | + |
69 | 96 | app.add_url_rule(
|
70 | 97 | "/api/feedback",
|
71 | 98 | endpoint="feedback",
|
72 |
| - view_func=lambda: send_feedback(mail), |
| 99 | + view_func=feedback_route, |
73 | 100 | methods=["POST"],
|
74 | 101 | )
|
75 | 102 |
|
|
0 commit comments