一、问题如下
在学习运用Flask框架时,遇到了一个问题:
source_file_path = os.path.join(zj_el_bp.root_path, 'static', 'SourceFile', 'ZhejiangProvince', '证据清单.docx')
print('source_file_path :',source_file_path )
输出为D:\Programming\WenshuWebsite\Web\routes\ZhejiangProvince\static\SourceFile\ZhejiangProvince\证据清单.docx
而不是
D:\Programming\WenshuWebsite\Web\static\SourceFile\ZhejiangProvince\证据清单.docx
二、查证结果如下
因为使用了 Flask 的 Blueprint,而 Blueprint 的 root_path 是基于该蓝图所在模块的目录结构自动推断出来的。
当创建一个 Flask Blueprint 时,root_path 自动指向定义该蓝图的 Python 文件所在的目录。例如:
zj_el_bp = Blueprint('zj_el', __name__)
在这个例子中,__name__ 是当前模块的名称。如果 Blueprint 定义在 routes/ZhejiangProvince/ 目录下,那么 root_path 就会自动被设置为:
D:\Programming\WenshuWebsite\Web\routes\ZhejiangProvince\
因此,source_file_path 会被拼接成:
D:\Programming\WenshuWebsite\Web\routes\ZhejiangProvince\static\SourceFile\ZhejiangProvince\证据清单.docx
三、解决方法如下
1. 使用相对路径(基于项目根目录)
手动调整路径,使其相对于项目根目录:
project_root = os.path.abspath(os.path.join(zj_el_bp.root_path, '../../..'))
source_file_path = os.path.join(project_root, 'static', 'SourceFile', 'ZhejiangProvince', '证据清单.docx')
通过这种方式,project_root 指向的是项目根目录 D:\Programming\WenshuWebsite\Web\,然后再在此基础上拼接剩余路径。
2. 在配置中设置路径
另一种常见的做法是将项目根路径设置在 Flask 配置中,并在代码中使用配置值:
app.config['PROJECT_ROOT'] = os.path.abspath(os.path.dirname(__file__))
然后在蓝图中这样使用:
source_file_path = os.path.join(app.config['PROJECT_ROOT'], 'static', 'SourceFile', 'ZhejiangProvince', '证据清单.docx')