You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
2.2 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"""
限流器使用示例
"""
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)