无法从'werkzeug'导入'secure_filename'名称

8

我正在尝试从werkzeug.utils导入secure_filename,但是出现了错误。在我的基础虚拟环境下可以正常工作。

代码:

# Flask packages
from flask import Flask, render_template, request, session, redirect, flash, send_file
from flask_bootstrap import Bootstrap 
from flask_uploads import UploadSet,configure_uploads,IMAGES,DATA,ALL

# Systems
import os 
import sys
import json
from werkzeug.utils import secure_filename

错误:

    (absa_annotation) C02QM3FSFVH3:ABSA-annotation-tool kwunkeilau$ python3 app.py 
Traceback (most recent call last):
  File "app.py", line 4, in <module>
    from flask_uploads import UploadSet,configure_uploads,IMAGES,DATA,ALL
  File "/Users/kwunkeilau/anaconda3/envs/absa_annotation/lib/python3.7/site-packages/flask_uploads.py", line 26, in <module>
    from werkzeug import secure_filename, FileStorage
ImportError: cannot import name 'secure_filename' from 'werkzeug' (/Users/kwunkeilau/anaconda3/envs/absa_annotation/lib/python3.7/site-packages/werkzeug/__init__.py)
3个回答

12

这个异常看起来像是Flask-Uploads正在尝试使用from werkzeug import secure_filename,而应该是from werkzeug.utils import secure_filename,就像你自己的代码一样。

根据Flask-Uploads的github存储库,这似乎已经在12个月前修复

我建议在您的虚拟环境中尝试pip install -U flask-uploads,以确保安装最新版本。

编辑

正如@mattficke指出的那样,PyPi版本已经过时,并且存储库中没有更新的版本。事实证明,您可以根据提交哈希直接安装最新版本(在撰写本文时):

pip install git+https://github.com/maxcountryman/flask-uploads.git@f66d7dc

或者在 requirements.txt 文件中:

git+https://github.com/maxcountryman/flask-uploads.git@f66d7dc

然后执行 pip install -r requirements.txt

这将奇迹般地发挥作用:

>>> from flask_uploads import UploadSet,configure_uploads,IMAGES,DATA,ALL
>>> # No Exception

尽管Github上的源代码很活跃,但是Flask-Uploads包似乎不再发布到PyPI了。最近发布的版本是2016年的:https://pypi.org/project/Flask-Uploads/ - mattficke
@mattficke 很好的发现:典型!看起来在github上最新的标记版本是2015年的0.2.0,比最新的pip版本还要早。不过我找到了一种根据提交哈希安装的方法,请参见编辑。 - v25
1
请看我的回答,有一个维护良好的分支 - 无需从github安装或操作导入语句。该分支经过更好的测试,修复了几个错误和一个安全问题。并且还在PyPI上提供发布版本。 - Jürgen Gmach

3

0
如果您只是想运行生产服务器,可以按照以下步骤操作(我假设您正在使用虚拟环境)。在虚拟环境的库文件夹中找到 flask_uploads.py 文件(类似于 /lib/pythonX.X/site-packages/flask_upalods.py)。然后找到并注释掉这一行代码:
from werkzeug import secure_filename, FileStorage

并通过添加以下行来更正引用:

from werkzeug.datastructure import FileStorage
from werkzeug.utils import secure_filename

当我遇到这个问题时,这就是我所做的。


这绝对是解释型语言(如Python)的优点之一,您可以更改第三方库以使自己摆脱困境。但是,我不认为我会建议手动更改site_packages的做法,因为该更改仅适用于一个环境。软件很少只部署一次。由于有可用的修复分支,因此切换到该分支是更可取的解决方案,因为安装修复程序包是一个易于重复的过程,特别是当依赖项在requirements.txt文件中列出时或者(更好的是)在p文件中列出。 - Eiríkur Fannar Torfason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接