Flask_uploads:ImportError:无法导入名称'secure_filename'

54

我想创建一个表单,使用 Flask 表单允许发送带有描述的图片。我尝试使用这个视频:https://www.youtube.com/watch?v=Exf8RbgKmhM

但是在运行 app.py 时遇到了问题。

➜  website git:(master) ✗ python3.6 app.py
Traceback (most recent call last):
  File "app.py", line 10, in <module>
    from flask.ext.uploads import UploadSet, configure_uploads, IMAGES
ModuleNotFoundError: No module named 'flask.ext'

我不得不将 flask.ext.uploads 替换为 flask_uploads,但现在我遇到了以下问题:

Traceback (most recent call last):
  File "app.py", line 10, in <module>
    from flask_uploads import UploadSet, configure_uploads, IMAGES
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/flask_uploads.py", line 26, in <module>
    from werkzeug import secure_filename, FileStorage
ImportError: cannot import name 'secure_filename'

我的导入和配置如下:

from datetime import datetime
from flask_sqlalchemy import SQLAlchemy
from flask import Flask, session, render_template, url_for, redirect, flash, request
from wtforms import Form, fields,TextField, StringField, PasswordField, BooleanField,validators
from wtforms.validators import InputRequired, Email, Length, DataRequired
from flask_wtf import FlaskForm
from flask_uploads import UploadSet, configure_uploads, IMAGES
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user

我无法解决这个问题,你有任何想法可以帮忙吗?

7个回答

151

flask_uploads.py 文件中

更改

from werkzeug import secure_filename,FileStorage

from werkzeug.utils import secure_filename
from werkzeug.datastructures import  FileStorage

1
实际上,不要这样做,否则您将无法再更新Flask-Uploads。请参考其他答案以获得更好的解决方案。 - Jürgen Gmach

36
根据该问题,这是与当前版本1.0.0的workzeug相关的错误。它已合并,但尚未在pypi上发布。目前已知的解决方法是将werkzeug=1.0.0降级为werkzeug==0.16.0

因此,要执行此操作,您只需运行以下命令:
pip install -U Werkzeug==0.16.0

从werkzeug的发布说明中可以看到版本0.16.1,但在错误报告中没有证据表明使用该版本会有任何帮助。


3
谢谢您的回答,我已经这样做了: 成功卸载Werkzeug-1.0.0 成功安装Werkzeug-0.16.0 但我仍然得到完全相同的错误,以ImportError结尾:无法导入名称'secure_filename' - Santeau
2
你能试着安装这个库吗,看看它是否解决了问题:pip install Flask-Uploads - Danizavtz
它已经被安装了(它打印出“需求已满足”)。 - Santeau
2
实际上不要这样做,否则你将会使用一个非常古老和过时的 Werkzeug 版本。请查看其他答案以获得更好的解决方案。 - Jürgen Gmach

22

您正在使用一份有缺陷的 Flask-Uploads 版本。

不幸的是,该软件包的维护者决定不向 PyPi 发布新版本。

您可以使用 Flask-Reuploaded 作为替代品,它可以解决您的问题。

https://pypi.org/project/Flask-Reuploaded/


8
对于 Werkzeug 版本 2.1.2,只需导入以下内容:secure_filenamefrom werkzeug.utils import secure_filename

0
使用以下代码: from werkzeug.utils import secure_filename

请解释一下为什么这可能有效。 - Owenn
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

0
我最终在我的requirements.txt文件中加入了以下内容:-e git://github.com/maxcountryman/flask-uploads.git#egg=elasticutils,以从git获取flask-uploads的最新版本。

0

使用Flask-Reuploaded而不是Flask-Uploads,当您不使用Werkzeug但仍然显示错误时,解决方案是--pip install Flask-Reuploaded


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