Flask中exec()函数无法正常工作的问题排查
为什么exec修改不了你的局部变量?
你遇到的问题核心在于:在函数(比如Flask的路由函数)内部,直接把locals()传给exec时,对这个字典的修改不会同步回实际的局部变量。
Python对函数内的局部变量有专门的优化机制,locals()返回的只是当前局部变量的一个快照字典,你修改这个字典里的内容,并不会影响真正的局部变量x,所以最后打印的还是初始值0。
解决办法
别用locals(),自己定义一个字典来存要操作的变量,执行完exec后从字典里取结果:
x = 0 # 自定义一个字典存变量 var_dict = {'x': x} exec("x = 10", globals(), var_dict) # 从字典里更新x的值 x = var_dict['x'] print(x) # 现在会输出10
如果不需要区分全局和局部变量,甚至可以直接用一个字典作为执行上下文:
ctx = {'x': 0} exec("x = 10", ctx) print(ctx['x']) # 输出10
⚠️ 重要提醒:在Flask里执行从数据库拉来的代码极度危险,属于典型的代码注入风险,除非你100%信任这个数据源,否则绝对不要这么做。
内容的提问来源于stack exchange,提问作者Olivier Picq
相关产品推荐
相关产品推荐

