He estado trabajando en una aplicación Flask durante algunas semanas. Lo terminé hoy y fui a implementarlo... y ahora no se inicia.
No agregué ni eliminé ningún código, así que suponga que algo cambió en el proceso de implementación.
De todos modos, aquí está el error completo que se muestra en la 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)También aquí está el código en los tres archivos mencionados.
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)")]) Intenté reinstalar el flask y flask_restplus pero no tuve suerte.
Tratar:
from werkzeug.utils import cached_propertyBajar de categoría a Werkzeug==0.16.1 resuelve esto
consulte https://github.com/noirbizarre/flask-restplus/issues/777#issuecomment-583235327
Quería agregar que una solución permanente (a largo plazo) sería mudarse a flask_restx ya que el flask-restplus ya no se mantiene.
La respuesta adecuada para mayo de 2020: el matraz-restplus está muerto, muévase al matraz-restx .
De noirbizarre/flask-restplus#778 (comentario) :
El trabajo de Flass-restplus ha sido descontinuado debido a que los mantenedores no tienen claves pypi. Vea la caída en el reemplazo, matraz-restx. Es una bifurcación oficial del equipo de mantenimiento. Ya hemos solucionado el problema allí.
De noirbizarre/flask-restplus#777 (comentario) :
No. Flask-restplus ya no se mantiene. Los antiguos mantenedores no tienen privilegios para impulsar a pypi, y después de muchos meses de intentarlo, bifurcamos el proyecto. Echa un vistazo a matraz-restx. Es un reemplazo directo y estamos planificando, diseñando y haciendo arreglos... por ejemplo, ya parcheamos para Werkzeug.
Por lo tanto, la solución real es pasar a Flass-restx en lugar de fijar a una versión anterior de Werkzeug.
Rebajar Werkzeug a 0.16.1
pip3 install --upgrade Werkzeug==0.16.1 Si hace una pip3 list , puede ver algo como esto:
Flask 1.1.2 Werkzeug 0.16.1Esto puede ser demasiado extraño para que le suceda a alguien más, pero... Verifique sus paquetes realmente importados. El mío se veía así:
Claramente, algo falló en la importación aquí... eliminó y volvió a agregar el paquete "werkzeug" correcto y "funcionó" (resulta que todavía necesito implementar una de las otras soluciones ofrecidas a esta pregunta... :-( )
Ah, pero usted pregunta: "¿Cómo elimino un paquete corrupto como este? ¡¡La GUI no me lo permite!!". No temas, eso también me pasó a mí. En Pycharm, encuentre la ubicación del archivo del paquete pasando el cursor sobre el nombre del paquete en el menú de configuración, vaya allí en el explorador de archivos y elimine la carpeta y cualquier otra cosa que se le parezca. Luego reinstale el paquete con la GUI.