Die Flask-App startet 'ImportError' nicht: Der Name 'cached_property' kann nicht aus 'werkzeug' importiert werden.

11

Ich arbeite seit einigen Wochen an einer Flask-App. Ich habe es heute fertiggestellt und es bereitgestellt ... und jetzt wird es nicht mehr gestartet.

Ich habe keinen Code hinzugefügt oder entfernt. Nehmen Sie also an, dass sich im Bereitstellungsprozess etwas geändert hat.

Hier ist der vollständige Fehler, der im Terminal angezeigt wird:

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)

Auch hier ist der Code in den drei genannten Dateien.

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)")])

Ich habe versucht, neu zu installieren flaskund flask_restplusaber kein Glück.

Keva161
quelle
2
Es sieht so aus, als ob Werkzeug 1.0.0 veröffentlicht wurde, was diesen Fehler an anderer Stelle verursacht hat . Flask-Restplus wird jedoch ebenfalls nicht gewartet . Sie können erwägen, zu Ihren Anforderungen zu flask-restxwechseln, oder versuchen, sie zu Werkzeug==0.16.1fixieren.
25.
In Python 3.8 können Siefrom functools import cached_property
Martin Thoma

Antworten:

9

Versuchen:

from werkzeug.utils import cached_property

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

thomask
quelle
flask_restplus Problem: github.com/noirbizarre/flask-restplus/issues/777
Velizar VESSELINOV
1
Problem beim Testen von Kolben: github.com/jarus/flask-testing/issues/143
Ri1a
Bitte denken Sie daran, dass flask_restplus als tot gilt: github.com/noirbizarre/flask-restplus/issues/770
Pitto
Wenn jemand dieses Problem mit Robobrowser hat, fügen Sie es über der Zeile 'aus Robobrowser importieren RoboBrowser' und 'import werkzeug'
sokoine hinzu