Werkzeug: A versão 1.0.0 removeu o código obsoleto

Criado em 6 fev. 2020  ·  22Comentários  ·  Fonte: pallets/werkzeug

A versão 1.0.0 que foi lançada 2 horas atrás publicou mudanças importantes para quem usa o flask. Não tenho certeza se foi um efeito desejado e o frasco deve fixar sua versão ou se mudanças neste projeto precisam acontecer.

Comentários muito úteis

Esta é uma experiência de usuário completamente horrível. O Flask-WTF 0.14.3 com as correções foi lançado horas atrás. Como estamos promovendo uma versão que remove o suporte quando grandes partes do ecossistema não estavam prontas para isso?

Acredito que esta seja a terceira vez que uma atualização em uma das bibliotecas de paletes quebrou um código que eu estava executando em menos de seis meses.

Todos 22 comentários

Por favor, poste rastreamentos completos se encontrar algum problema.

O problema não é com o Flask, e a Werkzeug não continuará oferecendo suporte a essas importações obsoletas. 0.16 tem emitido avisos de suspensão de uso por 5 meses. Use essa versão como uma etapa intermediária para identificar quais importações foram alteradas.

Você pode ajudar as extensões e outros projetos abrindo uma edição ou enviando um PR no projeto relevante.

  • Flask-Admin 1.5.5
  • Flask-Babel 1.0
  • Flask-BabelEx 0.9.4
  • flask-restplus (não mesclado, sem manutenção em favor de flask-restx)
  • flask-restx (mesclado, ainda não lançado)
  • Teste de frasco 0.8.0
  • Flask-WTF 0.14.3
  • django-extensions 2.2.8
  • frasco pytest 0.15.1
Traceback (most recent call last):
  File "/usr/local/bin/pytest", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.7/site-packages/_pytest/config/__init__.py", line 73, in main
    config = _prepareconfig(args, plugins)
  File "/usr/local/lib/python3.7/site-packages/_pytest/config/__init__.py", line 224, in _prepareconfig
    pluginmanager=pluginmanager, args=args
  File "/usr/local/lib/python3.7/site-packages/pluggy/hooks.py", line 286, in __call__
    return self._hookexec(self, self.get_hookimpls(), kwargs)
  File "/usr/local/lib/python3.7/site-packages/pluggy/manager.py", line 93, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
  File "/usr/local/lib/python3.7/site-packages/pluggy/manager.py", line 87, in <lambda>
    firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
  File "/usr/local/lib/python3.7/site-packages/pluggy/callers.py", line 203, in _multicall
    gen.send(outcome)
  File "/usr/local/lib/python3.7/site-packages/_pytest/helpconfig.py", line 89, in pytest_cmdline_parse
    config = outcome.get_result()
  File "/usr/local/lib/python3.7/site-packages/pluggy/callers.py", line 80, in get_result
    raise ex[1].with_traceback(ex[2])
  File "/usr/local/lib/python3.7/site-packages/pluggy/callers.py", line 187, in _multicall
    res = hook_impl.function(*args)
  File "/usr/local/lib/python3.7/site-packages/_pytest/config/__init__.py", line 794, in pytest_cmdline_parse
    self.parse(args)
  File "/usr/local/lib/python3.7/site-packages/_pytest/config/__init__.py", line 1000, in parse
    self._preparse(args, addopts=addopts)
  File "/usr/local/lib/python3.7/site-packages/_pytest/config/__init__.py", line 948, in _preparse
    self.pluginmanager.load_setuptools_entrypoints("pytest11")
  File "/usr/local/lib/python3.7/site-packages/pluggy/manager.py", line 299, in load_setuptools_entrypoints
    plugin = ep.load()
  File "/usr/local/lib/python3.7/site-packages/importlib_metadata/__init__.py", line 94, in load
    module = import_module(match.group('module'))
  File "/usr/local/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "/usr/local/lib/python3.7/site-packages/_pytest/assertion/rewrite.py", line 143, in exec_module
    exec(co, module.__dict__)
  File "/usr/local/lib/python3.7/site-packages/pytest_flask/plugin.py", line 14, in <module>
    from werkzeug import cached_property
ImportError: cannot import name 'cached_property' from 'werkzeug' (/usr/local/lib/python3.7/site-packages/werkzeug/__init__.py)

Isso é pytest-flask, você vai querer contatá-los. Parece que o pytest-flask 0.15.1 já foi lançado com uma correção.

+1, tendo o seguinte problema:
packages/flask_wtf/recaptcha/widgets.py", line 5, in <module> from werkzeug import url_encode ImportError: cannot import name 'url_encode'

+1 esta versão mais recente também está quebrando nossas dependências. Parece ser um problema V1.0.0

`` `Traceback (última chamada mais recente):
Arquivo "/home/ec2-user/butter_web/venv/lib64/python3.6/site-packages/flask/cli.py", linha 240, em locate_app
__import __ (module_name)
Arquivo "/home/ec2-user/butter_web/butter.py", linha 1, em
do app import app, db
Arquivo "/home/ec2-user/butter_web/app/__init__.py", linha 8, em
de flask_admin.contrib.sqla import ModelView
Arquivo "/home/ec2-user/butter_web/venv/lib64/python3.6/site-packages/flask_admin/contrib/sqla/__init__.py", linha 2, em
de .view import ModelView
Arquivo "/home/ec2-user/butter_web/venv/lib64/python3.6/site-packages/flask_admin/contrib/sqla/view.py", linha 19, em
from flask_admin.model import BaseModelView
Arquivo "/home/ec2-user/butter_web/venv/lib64/python3.6/site-packages/flask_admin/model/__init__.py", linha 2, em
from .base import BaseModelView
Arquivo "/home/ec2-user/butter_web/venv/lib64/python3.6/site-packages/flask_admin/model/base.py", linha 8, em
from werkzeug import secure_filename
ImportError: não é possível importar o nome 'secure_filename'

Qual é a solução aqui? Bloquear explicitamente o 0.16.1 não resolve isso.

@ tjohnson4 Veja meu comentário acima para

Esta é uma experiência de usuário completamente horrível. O Flask-WTF 0.14.3 com as correções foi lançado horas atrás. Como estamos promovendo uma versão que remove o suporte quando grandes partes do ecossistema não estavam prontas para isso?

Acredito que esta seja a terceira vez que uma atualização em uma das bibliotecas de paletes quebrou um código que eu estava executando em menos de seis meses.

problema semelhante

Traceback (most recent call last):
  File "/usr/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/ubuntu/swagger-codegen/samples/server/petstore/flaskConnexion/swagger_server/__main__.py", line 3, in <module>
    import connexion
  File "/home/ubuntu/.local/lib/python3.6/site-packages/connexion/__init__.py", line 3, in <module>
    from .apis import AbstractAPI  # NOQA
  File "/home/ubuntu/.local/lib/python3.6/site-packages/connexion/apis/__init__.py", line 1, in <module>
    from .abstract import AbstractAPI  # NOQA
  File "/home/ubuntu/.local/lib/python3.6/site-packages/connexion/apis/abstract.py", line 14, in <module>
    from ..operation import Operation
  File "/home/ubuntu/.local/lib/python3.6/site-packages/connexion/operation.py", line 7, in <module>
    from .decorators import validation
  File "/home/ubuntu/.local/lib/python3.6/site-packages/connexion/decorators/validation.py", line 9, in <module>
    from werkzeug import FileStorage
ImportError: cannot import name 'FileStorage'

Gambiarra
adicionar werkzeug == 0.16.1 a requirements.txt resolveu para mim

A conexão de @ Abdelsalam-Abbas corrigiu essa importação em outubro de 2019 - talvez você esteja executando uma versão antiga?
https://github.com/zalando/connexion/releases/tag/2.4.0

Se sua Flask-Session estiver quebrada:

File "/usr/local/lib/python3.8/site-packages/flask_session/__init__.py", line 61, in init_app                                                                                                                                                                                                                               
    app.session_interface = self._get_interface(app)                                                                                                                                                                                                                                                                          
  File "/usr/local/lib/python3.8/site-packages/flask_session/__init__.py", line 90, in _get_interface                                                                                                                                                                                                                         
    session_interface = FileSystemSessionInterface(                                                                                                                                                                                                                                                                           
  File "/usr/local/lib/python3.8/site-packages/flask_session/sessions.py", line 313, in __init__                                                                                                                                                                                                                              
    from werkzeug.contrib.cache import FileSystemCache                                                                                                                                                                                                                                                                        
ModuleNotFoundError: No module named 'werkzeug.contrib'  

Adicionar werkzeug == 0.16.1 a requirements.txt resolveu para mim

Se o seu Flask-RestPlus estiver quebrado:

Traceback (most recent call last):
  File "/export/home/hysdsops/sciflo/lib/python3.7/site-packages/flask/cli.py", line 240, in locate_app
    __import__(module_name)
  File "/export/home/hysdsops/sciflo/ops/pele/app.py", line 4, in <module>
    from pele import create_app, db
  File "/export/home/hysdsops/sciflo/ops/pele/pele/__init__.py", line 5, in <module>
    from flask_restplus import apidoc
  File "/export/home/hysdsops/sciflo/lib/python3.7/site-packages/flask_restplus/__init__.py", line 4, in <module>
    from . import fields, reqparse, apidoc, inputs, cors
  File "/export/home/hysdsops/sciflo/lib/python3.7/site-packages/flask_restplus/fields.py", line 17, in <module>
    from werkzeug import cached_property
ImportError: cannot import name 'cached_property' from 'werkzeug' (/export/home/hysdsops/sciflo/lib/python3.7/site-packages/werkzeug/__init__.py)

Adicionar werkzeug == 0.16.1 a requirements.txt resolveu para mim.

Alguém se importaria de fornecer algumas dicas sobre por que meu objeto de solicitação de frasco retornado de werkzeug de LocalProxy é de uma versão diferente da que eu tenho localmente?

Desde esta versão, estou recebendo este erro:
File "/Users/lucas/Software/anaconda3/envs/pytest/lib/python3.6/site-packages/flask/json.py", line 251, in jsonify if current_app.config['JSONIFY_PRETTYPRINT_REGULAR'] and not request.is_xhr: File "/Users/lucas/Software/anaconda3/envs/pytest/lib/python3.6/site-packages/werkzeug/local.py", line 347, in __getattr__ return getattr(self._get_current_object(), name) AttributeError: 'Request' object has no attribute 'is_xhr'

is_xhr é uma propriedade que foi removida do Flask 1.0 , mas localmente eu tenho 0.12.2 instalado. Só para ficar claro, estou postando este problema aqui porque o bug não está no Flask, ao invés disso, estou confuso sobre por que / como LocalProxy está retornando uma versão mais recente deste aplicativo Flask, então estou esperando.

@LucasLLC is_xhr nunca fez parte diretamente do Flask (há uma referência que afirma que foi removido no Flask 1.0? Não consigo ver no changelog) ao invés disso, sempre foi uma API Werkzeug que o Flask expõe. Em termos de Werkzeug, você pode ver que ele foi removido em 81e10efbf3a83daf09c55cd7cc13ac6c6464d405.

Se você ainda não o fez, recomendo fixar suas dependências e atualizar periodicamente, uma tarefa que é facilitada por ferramentas como a poesia .

@pgjones idealmente fazemos uma versão de correção de

Além disso, sim, esta API é efetivamente Flask API e foi documentada como tal: https://flask.palletsprojects.com/en/0.12.x/api/#flask.Request.is_xhr

@LucasLLC is_xhr nunca fez parte diretamente do Flask (há uma referência que afirma que foi removido no Flask 1.0? Não consigo ver no changelog) ao invés disso, sempre foi uma API Werkzeug que o Flask expõe. Em termos de Werkzeug, você pode ver que ele foi removido em 81e10ef .

Ah, erro meu. Eu estava me referindo ao aviso gerado neste método, e não percebi que vinha de Werkzeug, isso faz muito mais sentido.

Se você ainda não o fez, recomendo fixar suas dependências e atualizar periodicamente, uma tarefa que é facilitada por ferramentas como a poesia .

Obrigado pela dica! Vamos estudar poesia.

Teve problemas ao instalar o odoo12:

    import werkzeug.contrib.fixers
ImportError: No module named 'werkzeug.contrib'

No entanto, resolvido com

Werkzeug==0.16.1

o mesmo erro aconteceu

ModuleNotFoundError: Nenhum módulo chamado 'werkzeug.contrib'

Tendo o mesmo problema com o frasco

Definir Werkzeug==0.16.1 corrigiu o problema.

`` `
de flask_admin.contrib.sqla import ModelView
Arquivo "/usr/local/lib/python3.6/site-packages/flask_admin/contrib/sqla/__init__.py", linha 2, em

de .view import ModelView
Arquivo "/usr/local/lib/python3.6/site-packages/flask_admin/contrib/sqla/view.py", linha 18, em

from flask_admin.model import BaseModelView
Arquivo "/usr/local/lib/python3.6/site-packages/flask_admin/model/__init__.py", linha 2, em

from .base import BaseModelView
Arquivo "/usr/local/lib/python3.6/site-packages/flask_admin/model/base.py", linha 8, em

from werkzeug import secure_filename
ImportError: não é possível importar o nome 'secure_filename'

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

SimonSapin picture SimonSapin  ·  12Comentários

ngaya-ll picture ngaya-ll  ·  8Comentários

sorenh picture sorenh  ·  4Comentários

mrx23dot picture mrx23dot  ·  6Comentários

alexgurrola picture alexgurrola  ·  5Comentários