Flask从外部函数导入全局变量报错AttributeError问题排查
问题原因及解决办法
错误原因
你尝试用scatter_plot.countryCode访问函数内部的变量,这是错误的——函数内部定义的变量(哪怕用global声明)不会自动变成函数对象的属性,Python会把scatter_plot.countryCode当成要访问函数这个对象的属性,而这个属性根本不存在,所以抛出AttributeError。
推荐解决方案:让函数返回多个值
这是最安全、最清晰的方式,适配Flask多请求场景,不会出现变量覆盖问题:
- 修改
by_continent.py里的scatter_plot函数,让它同时返回图表内容和countryCode:
def scatter_plot(countryVal): # 原有逻辑:生成图表、计算得到countryCode # ... # 最后返回两个结果 return generated_plot, countryCode
- 在
app.py里调用函数时同时接收两个返回值,再传给模板:
from functions.by_continent import scatter_plot # 接收图表内容和countryCode plot_content, country_code = scatter_plot(countryVal) # 把country_code传递给HTML模板 return render_template('index.html', country_code=country_code, plot=plot_content)
不推荐的方式(仅作了解,存在并发风险)
如果一定要通过函数属性或全局变量获取,需注意Flask是多请求环境,多个用户同时访问时会互相覆盖变量值:
方式1:给函数添加属性
修改by_continent.py的函数:
def scatter_plot(countryVal): # 原有逻辑计算得到countryCode countryCode = "xxx" # 将countryCode赋值为函数自身的属性 scatter_plot.countryCode = countryCode # 返回图表内容 return generated_plot
在app.py里调用后访问:
scatter_plot(countryVal) country_code = scatter_plot.countryCode
方式2:使用全局变量
在by_continent.py里定义全局变量:
# 先声明全局变量 countryCode = None def scatter_plot(countryVal): global countryCode # 计算并赋值countryCode countryCode = "xxx" # 返回图表内容 return generated_plot
在app.py里导入该全局变量:
from functions.by_continent import scatter_plot, countryCode scatter_plot(countryVal) country_code = countryCode
内容的提问来源于stack exchange,提问作者ruthpozuelo
相关产品推荐
相关产品推荐

