引入接口频率限制机制
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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="请求频率超限,请稍后再试。"
|
||||
)
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user