引入接口频率限制机制

This commit is contained in:
不胜舟
2025-08-25 22:01:33 +08:00
parent 041447585c
commit 4da732538f
11 changed files with 46 additions and 3 deletions
+2
View File
@@ -7,6 +7,7 @@ from .init_mail import init_mail, mail as flask_mail
from .init_upload import init_upload
from .init_migrate import init_migrate
from .init_session import init_session
from .init_limit import init_limit
from .init_plugins import register_plugin, broadcast_execute
@@ -22,6 +23,7 @@ def init_plugs(app: Flask) -> None:
init_upload(app)
init_migrate(app)
init_session(app)
init_limit(app)
# 系统蓝图相关
init_template_directives(app)
+8 -2
View File
@@ -1,4 +1,4 @@
from flask import render_template
from flask import render_template, jsonify
def init_error_views(app):
@@ -12,4 +12,10 @@ def init_error_views(app):
@app.errorhandler(500)
def internal_server_error(e):
return render_template('errors/500.html'), 500
return render_template('errors/500.html'), 500
@app.errorhandler(429)
def ratelimit_exceeded(e):
return jsonify(
success=False, msg="请求频率超限,请稍后再试。"
)
+20
View File
@@ -0,0 +1,20 @@
from flask_limiter import Limiter
from flask_login import current_user
from flask import request, Flask
# 定义 key 函数:优先使用 current_user.id,否则用 IP
def get_user_identifier():
# 注意:current_user 可能是 AnonymousUserMixin(未登录)
if hasattr(current_user, 'id') and current_user.is_authenticated:
return str(current_user.id) # 用户 ID 作为 key
return request.remote_addr # 未登录用户则按 IP 限流
limiter = Limiter(
key_func=get_user_identifier,
# default_limits=["100 per hour"], # 可选全局默认
storage_uri="memory://" # 生产建议: "redis://localhost:6379"
)
def init_limit(app: Flask) -> None:
limiter.init_app(app)