Python通过subprocess调用Docker Redis实现Flask接口锁机制
本文详解如何利用Python的subprocess模块在Flask框架中操作Docker容器内的Redis。通过封装命令执行函数,实现获取、设置及删除Redis键值对的功能,进而构建接口级别的加锁与解锁逻辑。重点解析了docker exec命令中-it参数的潜在风险,确保后台服务稳定运行。
利用subprocess模块执行Docker命令
在Python中操作Docker容器内的Redis,可以通过subprocess模块执行系统命令来实现。该模块允许程序调用外部命令并获取输出结果,是连接Python应用与容器化基础设施的桥梁。
命令执行函数封装
#encoding:utf-8
import subprocess
def cmd(command):
subp = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding="utf-8")
subp.wait(2)
if subp.poll() == 0:
return subp.communicate()
else:
return None
获取redis键所对应的值
def get_output(command):
subp = subprocess.getoutput(command)
return subp
Flask接口获取Redis数据
在Flask框架中,可以通过定义路由接口来获取Docker容器内Redis存储的键值对。具体实现中,接收前端传入的参数,构造对应的docker exec命令,调用封装好的命令执行函数,从Redis中读取指定key的值,并返回相应的状态信息。
获取键值对接口实现
@ui_case_set.route("/get_code", methods=["GET"])
@allow_cross_domain
def get_code():
set_id = request.values.get("id")
if not set_id:
return response_fail(msg="缺少参数用例集id")
key_name = "key" + str(set_id)
value_name = get_output("docker exec {0} redis-cli get {1}".format(DockerConfig.container_redis_name, key_name))
if value_name:
return response_fail(msg="此测试集正被{}编辑!".format("金刚"))
else:
return response_success(msg="可以进行编辑!")
Flask接口增删Redis数据
除了读取,Flask接口还需支持对Docker内Redis键值对的增加与删除操作,常用于实现资源锁机制。当需要上锁时,获取当前时间并设置过期时间存入Redis;当需要解锁时,直接删除对应的key。这些操作均通过subprocess调用redis-cli命令完成,确保状态同步。
加锁与解锁接口实现
@ui_case_set.route("/time_limit", methods=["POST"])
@allow_cross_domain
def set_time():
# lock:为1:上锁, 为0时: 解锁
set_id = request.json.get("id")
locak = request.json.get("lock")
# if not all([set_id, locak]):
# return response_fail(msg="参数不足")
key_name = "key" + str(set_id)
if locak == 1:
value_name = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
cmd("docker exec {0} redis-cli setex {1} 300 '{2}'".format(DockerConfig.container_redis_name, key_name, value_name))
return response_success(content={"lock_status": 1}, msg="测试集{}上锁成功".format(set_id))
else:
cmd("docker exec {0} redis-cli del {1}".format(DockerConfig.container_redis_name, key_name))
return response_success(content={"lock_status": 0}, msg="测试集{}解锁成功".format(set_id))
注意事项:避免使用-it参数
在调用docker exec命令时,务必避免使用“-it”参数。例如,执行“docker exec -it [容器名] redis-cli set key value”时,若加上“-it”,命令会尝试开启一个交互模式的终端。这在前台手动运行时可能正常,但在Python程序后台自动运行时会导致失败或挂起,因为后台进程无法提供交互所需的终端环境。
通过上述方法,可以在Python后端稳定地管理Docker容器中的Redis资源,实现接口级别的并发控制。正确理解并规避命令执行中的交互参数陷阱,是保证自动化脚本稳定运行的关键。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









