前提条件
- 已经有一个Flask应用。
- 已经安装了Flask和redis服务。
步骤1:安装Redis和Flask-Limiter
首先,需要安装redis
和Flask-Limiter
库。推荐在生产环境中使用Redis存储限流信息。
pip install redis Flask-Limiter
Flask-Limiter
会通过redis
存储限流信息,确保应用不会在高并发的情况下发生性能瓶颈。
步骤2:配置Redis连接
在Flask应用的配置文件中,指定Redis的连接地址。通常,Redis会运行在默认端口6379
,并且你可以选择使用一个数据库(Redis默认有16个数据库,编号为0-15)。这里,我们使用0
号数据库。
python
# config.py
REDIS_URL = "redis://127.0.0.1:6379/0" # Redis连接地址和数据库编号
如果你使用的是Redis集群或其他定制的Redis服务,可以根据需要修改REDIS_URL
。
步骤3:设置Flask-Limiter
在Flask应用中初始化Flask-Limiter
,并配置使用Redis作为存储。这一步将限制每个IP地址在一定时间内的请求次数,防止CC攻击。
Flask-Limiter配置:
python
from flask import Flask, send_file, request
from flask_limiter import Limiter
import config
app = Flask(__name__)
# 绑定配置文件
app.config.from_object(config)
# 设置Redis连接为Flask-Limiter的存储
limiter = Limiter(
key_func=lambda: request.remote_addr, # 获取用户IP
app=app,
storage_uri=app.config['REDIS_URL'], # Redis连接地址
default_limits=["15 per minute"] # 设置全局每分钟最多请求次数
)
# 示例视图函数
@app.route('/')
@limiter.limit("15 per minute") # 每个IP每分钟最多访问15次
def index():
return send_file("static/index.html")
@app.route("/favicon.ico", methods=["GET"])
@limiter.limit("15 per minute") # 同样限制该视图的请求
def favicon():
return send_file("static/favicon.ico")
if __name__ == "__main__":
port = 5000
print(f"服务器已启动,监听:0.0.0.0:{port}")
app.run(host="0.0.0.0", port=port)
步骤4:部署和测试
启动Redis服务 : 确保Redis服务在本地或服务器上运行,默认端口是6379
。
启动Flask应用: 运行Flask应用并进行测试,确保限流机制有效。
我自己使用的是宝塔进行搭建Python的Flask项目,整体根据以上步骤是基表方便实现的。