'cannot import name 'secure_filename' from 'werkzeug'
I'm trying to import secure_filename from werkzeug.utils and it shoot an error. It works fine under my base virtual env.
code:
# 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
Error:
(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)
Solution 1:[1]
That exception looks like Flask-Uploads
is trying to from werkzeug import secure_filename
which should be from werkzeug.utils import secure_filename
, as per your own code.
Going by the Flask-Uploads
github repo this appears to have been fixed 12 months ago.
I'd try pip install -U flask-uploads
in your virtual environment, to ensure the latest version.
EDIT:
As @mattficke points out, the PyPi version is dated, and there's not a more recent release on the repo. Turns out you can install directly based on a commit hash, so for the latest (at the time of writing this):
pip install git+https://github.com/maxcountryman/flask-uploads.git@f66d7dc
Or in a requirements.txt
:
git+https://github.com/maxcountryman/flask-uploads.git@f66d7dc
Then pip install -r requirements.txt
.
Which works wonders:
>>> from flask_uploads import UploadSet,configure_uploads,IMAGES,DATA,ALL
>>> # No Exception
Solution 2:[2]
Alternatively to above suggested solution, you can use the well maintained fork called Flask-Reuploaded
.
You do not even have to change import statements, as it tries to stay compatible with the no longer well maintained Flask-Uploads
.
See https://github.com/jugmac00/flask-reuploaded
Also, Flask-Reuploaded
certainly provides uptodate packages on PyPI:
Solution 3:[3]
If you're just trying to run the production server, you can do as follows (I suppose you're using a virtual environment by the way). Find flask_uploads.py inside the library folder of your virtual environment (something like /lib/pythonX.X/site-packages/flask_upalods.py). Then find and comment the line:
from werkzeug import secure_filename, FileStorage
and correct the references by adding these lines:
from werkzeug.datastructure import FileStorage
from werkzeug.utils import secure_filename
That is what I did when I ran into this problem.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | Jürgen Gmach |
Solution 3 | ptrckfc_ |