Flask app wont launch 'ImportError: cannot import name 'cached_property' from 'werkzeug' '

37,673

Solution 1

Try:

from werkzeug.utils import cached_property

https://werkzeug.palletsprojects.com/en/1.0.x/utils/

Solution 2

The proper answer for May 2020: flask-restplus is dead, move to flask-restx.

From noirbizarre/flask-restplus#778 (comment):

flask-restplus work has been discontinued due to maintainers not having pypi keys. See the drop in replacement, flask-restx. It's an official fork by the maintainer team. We have already fixed the issue there

From noirbizarre/flask-restplus#777 (comment):

No. Flask-restplus is no longer maintained. The former maintainers do not have privileges to push to pypi, and after many months of trying, we forked the project. Check out flask-restx. It's a drop in replacement and we are roadmapping, designing, and making fixes...for instance, we already patched for Werkzeug

So the real solution is to move to flask-restx rather than pinning to an old version of Werkzeug.

Solution 3

Downgrading to Werkzeug==0.16.1 solves this

see https://github.com/noirbizarre/flask-restplus/issues/777#issuecomment-583235327

EDIT

Wanted to add that a permanent(long term) solution would be to move to flask_restx as flask-restplus is no longer being maintained.

See how to migrate from flask-restplus

Solution 4

Downgrade Werkzeug to 0.16.1

pip3 install --upgrade Werkzeug==0.16.1

If you do a pip3 list you may see something like this:

Flask              1.1.2
Werkzeug           0.16.1

Solution 5

For fix this painful bug was to identify what happen after the installation of the new package in the file PipFile.lock was to do a diff file and find the differences:

make a diff of the file PipFile after installation of the package

What I found after the installation of the package was the werkzeug package change her version of "version": "==0.15.2" to "version": "==1.0.1" and when try to excute the command sudo docker-compose build give me the error.

To fix this error this is what I did:

Discard all the change and start again.

Stop and remove your previous docker

sudo docker stop $(sudo docker ps -aq)

sudo docker rm $(sudo docker ps -aq)

enter image description here

Execute again the docker:

sudo docker-compose build

Running the docker again

sudo docker-compose up

enter image description here

Go inside of the docker , get the id of the docker : first press CRTL+z to pause the docker and after in the terminal execute

sudo docker ps

Get the number of the CONTAINER ID column

enter image description here

execute : sudo docker exec -it 23f77dbefd57 bash for enter in terminal of the docker

enter image description here

Now execute the package that you want in my case is SOAPpy, like this

 `pipenv install SOAPpy`

enter image description here

And after this instalation, install the previous package of the werkzeug package in my case is

pipenv install Werkzeug==0.15.2

enter image description here

write exit and press "Enter" in the terminal, for close the terminal inside the docker.

enter image description here

If you compare the files Pipfile.lock have the same version, this is the real fix.

enter image description here

for final steps is to do : stop , build and up the docker again:

sudo docker stop $(sudo docker ps -aq)

sudo docker-compose build

sudo docker-compose up

Now is running again the docker:

enter image description here

A note to myself, I just want to remind you that you are capable of everything and not giving up so easily, remember there is always one way, it is only to connect the dots. Never give up without fighting.

Share:
37,673
Keva161
Author by

Keva161

Software tester and developer

Updated on July 09, 2022

Comments

  • Keva161
    Keva161 almost 2 years

    I've been working on a Flask app for a few weeks. I finished it today and went to deploy it... and now it won't launch.

    I haven't added or removed any code so assume something has changed in the deployment process?

    Anyway, here is the full error displayed in the terminal:

    Traceback (most recent call last):
      File "C:\Users\Kev\Documents\Projects\Docket\manage.py", line 5, in <module>
        from app import create_app, db
      File "C:\Users\Kev\Documents\Projects\Docket\app\__init__.py", line 21, in <module>
        from app.api import api, blueprint, limiter
      File "C:\Users\Kev\Documents\Projects\Docket\app\api\__init__.py", line 2, in <module>
        from flask_restplus import Api
      File "C:\Users\Kev\.virtualenvs\Docket-LasDxOWU\lib\site-packages\flask_restplus\__init_
    _.py", line 4, in <module>
        from . import fields, reqparse, apidoc, inputs, cors
      File "C:\Users\Kev\.virtualenvs\Docket-LasDxOWU\lib\site-packages\flask_restplus\fields.
    py", line 17, in <module>
        from werkzeug import cached_property
    ImportError: cannot import name 'cached_property' from 'werkzeug' (C:\Users\Kev\.virtualen
    vs\Docket-LasDxOWU\lib\site-packages\werkzeug\__init__.py)
    

    Also here's the code in the three files mentioned.

    manage.py:

    from apscheduler.schedulers.background import BackgroundScheduler
    from flask_script import Manager
    from flask_migrate import Migrate, MigrateCommand
    
    from app import create_app, db
    
    app = create_app()
    app.app_context().push()
    
    manager = Manager(app)
    
    migrate = Migrate(app, db)
    
    manager.add_command('db', MigrateCommand)
    
    from app.routes import *
    from app.models import *
    
    def clear_data():
        with app.app_context():
            db.session.query(User).delete()
            db.session.query(Todo).delete()
            db.session.commit()
            print("Deleted table rows!")
    
    @manager.command
    def run():
        scheduler = BackgroundScheduler()
        scheduler.add_job(clear_data, trigger='interval', minutes=15)
        scheduler.start()
        app.run(debug=True)
    
    if __name__ == '__main__':
        clear_data()
        manager.run()
    

    app/__init__.py:

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    from flask_login import LoginManager
    
    from config import Config
    
    db = SQLAlchemy()
    
    login = LoginManager()
    
    def create_app():
        app = Flask(__name__)
        app.config.from_object(Config)
        db.init_app(app)
    
        login.init_app(app)
        login.login_view = 'login'
    
        from app.api import api, blueprint, limiter
        from app.api.endpoints import users, todos, register
        from app.api.endpoints.todos import TodosNS
        from app.api.endpoints.users import UserNS
        from app.api.endpoints.register import RegisterNS
    
        api.init_app(app)
    
        app.register_blueprint(blueprint)
    
        limiter.init_app(app)
    
        api.add_namespace(TodosNS)
        api.add_namespace(UserNS)
        api.add_namespace(RegisterNS)
    
        return app
    

    api/__init__.py:

    from logging import StreamHandler
    from flask_restplus import Api
    from flask import Blueprint
    from flask_limiter import Limiter
    from flask_limiter.util import get_remote_address
    
    blueprint = Blueprint('api', __name__, url_prefix='/api')
    
    limiter = Limiter(key_func=get_remote_address)
    limiter.logger.addHandler(StreamHandler())
    
    api = Api(blueprint, doc='/documentation', version='1.0', title='Docket API',
              description='API for Docket. Create users and todo items through a REST API.\n'
                          'First of all, begin by registering a new user via the registration form in the web interface.\n'
                          'Or via a `POST` request to the `/Register/` end point', decorators=[limiter.limit("50/day", error_message="API request limit has been reached (50 per day)")])
    

    I've tried reinstalling flask & flask_restplus but no-luck.

  • Velizar VESSELINOV
    Velizar VESSELINOV about 4 years
  • Ri1a
    Ri1a about 4 years
  • Pitto
    Pitto about 4 years
    Please remember that flask_restplus is considered dead: github.com/noirbizarre/flask-restplus/issues/770
  • IvanFernand
    IvanFernand about 4 years
    If anyone is having this problem with Robobrowser add it above the line 'from robobrowser import RoboBrowser' and add 'import werkzeug'
  • Martlark
    Martlark over 3 years
    NOTE: flask_restplus is no longer maintained. Migrate to Flask-RestX: flask-restx.readthedocs.io/en/latest . It is a straight forward migration and resolves this error.
  • B. Latif
    B. Latif over 2 years
    is right on the money. It is time to move to flask_restx as flask-restplus is not being maintained. This will solve the werkzeug problem.