|
|
"""
|
|
|
限流器使用示例
|
|
|
"""
|
|
|
from flask import jsonify
|
|
|
from iti.applications.extensions.limit import limiter
|
|
|
|
|
|
|
|
|
def create_example_app():
|
|
|
"""创建示例应用"""
|
|
|
from iti.applications import create_app
|
|
|
return create_app('dev')
|
|
|
|
|
|
|
|
|
app = create_example_app()
|
|
|
|
|
|
|
|
|
@app.route('/')
|
|
|
def index():
|
|
|
"""首页 - 使用默认限流"""
|
|
|
return jsonify({'message': 'Hello, World!'})
|
|
|
|
|
|
|
|
|
@app.route('/api/public')
|
|
|
@limiter.limit("10 per minute") # 自定义限流:每分钟10次
|
|
|
def public_api():
|
|
|
"""公共 API - 自定义限流"""
|
|
|
return jsonify({'message': 'Public API', 'data': 'some data'})
|
|
|
|
|
|
|
|
|
@app.route('/api/private')
|
|
|
@limiter.limit("5 per minute") # 更严格的限流:每分钟5次
|
|
|
def private_api():
|
|
|
"""私有 API - 更严格的限流"""
|
|
|
return jsonify({'message': 'Private API', 'data': 'sensitive data'})
|
|
|
|
|
|
|
|
|
@app.route('/api/unlimited')
|
|
|
@limiter.exempt # 豁免限流
|
|
|
def unlimited_api():
|
|
|
"""无限制 API - 豁免限流"""
|
|
|
return jsonify({'message': 'Unlimited API', 'data': 'no limits'})
|
|
|
|
|
|
|
|
|
@app.route('/api/conditional')
|
|
|
@limiter.limit("20 per hour", per_method=True) # 按方法限流
|
|
|
def conditional_api():
|
|
|
"""条件限流 API - 按方法限流"""
|
|
|
return jsonify({'message': 'Conditional API', 'data': 'method specific'})
|
|
|
|
|
|
|
|
|
@app.route('/api/user-specific')
|
|
|
@limiter.limit("100 per hour", key_func=lambda: "user_123") # 自定义键函数
|
|
|
def user_specific_api():
|
|
|
"""用户特定 API - 自定义键函数"""
|
|
|
return jsonify({'message': 'User specific API', 'user': 'user_123'})
|
|
|
|
|
|
|
|
|
@app.route('/api/rate-limit-info')
|
|
|
def rate_limit_info():
|
|
|
"""获取限流信息"""
|
|
|
if limiter is None:
|
|
|
return jsonify({'message': 'Rate limiting is disabled'})
|
|
|
|
|
|
return jsonify({
|
|
|
'message': 'Rate limiting is enabled',
|
|
|
'default_limits': limiter.default_limits,
|
|
|
'storage_uri': limiter.storage_uri,
|
|
|
'key_func': limiter.key_func.__name__ if limiter.key_func else None
|
|
|
})
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
print("🚀 启动限流器示例应用")
|
|
|
print("📊 访问 http://localhost:5000/api/rate-limit-info 查看限流配置")
|
|
|
print("🔒 访问其他端点测试限流功能")
|
|
|
app.run(debug=True)
|