最初的问题,我正在 Flask 应用程序框架上进行开发,我正在尝试蓝图模板,它更新了我的 python 版本,我认为是 3.8.4,并且出现了这个新错误。我使用的是 python 3.8.3
flask run
输出了一个复杂的错误,一个Python类型的Error。
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1264.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 194, in _run_module_as_main
return _run_code(code, main_globals, None,
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1264.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 87, in _run_code
exec(code, run_globals)
File "D:\Openvessel\vessel-app\vessel_env\Scripts\flask.exe\__main__.py", line 9, in <module>
File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\flask\cli.py", line 966, in main
cli.main(prog_name="python -m flask" if as_module else None)
File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\flask\cli.py", line 586, in main
return super(FlaskGroup, self).main(*args, **kwargs)
File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\click\core.py", line 782, in main
rv = self.invoke(ctx)
File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\click\core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\click\core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\click\core.py", line 610, in invoke
return callback(*args, **kwargs)
File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\click\decorators.py", line 73, in new_func
return ctx.invoke(f, obj, *args, **kwargs)
File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\click\core.py", line 610, in invoke
return callback(*args, **kwargs)
File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\flask\cli.py", line 848, in run_command
app = DispatchingApp(info.load_app, use_eager_loading=eager_loading)
File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\flask\cli.py", line 305, in __init__
self._load_unlocked()
File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\flask\cli.py", line 330, in _load_unlocked
self._app = rv = self.loader()
File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\flask\cli.py", line 388, in load_app
app = locate_app(self, import_name, name)
File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\flask\cli.py", line 240, in locate_app
__import__(module_name)
File "D:\Openvessel\vessel-app\Back-end\app.py", line 1, in <module>
from vessel_app import create_app
File "D:\Openvessel\vessel-app\Back-end\vessel_app\__init__.py", line 21, in <module>
db = SQLAlchemy()
File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\flask_sqlalchemy\__init__.py", line 716, in __init__
self.Model = self.make_declarative_base(model_class, metadata)
File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\flask_sqlalchemy\__init__.py", line 798, in make_declarative_base
model.query_class = self.Query
File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\sqlalchemy\ext\declarative\api.py", line 79, in __setattr__
_add_attribute(cls, key, value)
File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\sqlalchemy\ext\declarative\base.py", line 802, in _add_attribute
type.__setattr__(cls, key, value)
TypeError: can't apply this __setattr__ to DefaultMeta object
我最后的猜测是它或它的python版本3.8.4 slim有这个错误。
File "D:\Openvessel\vessel-app\Back-end\vessel_app\__init__.py", line 21, in <module>
db = SQLAlchemy()
这看起来像是Python语言中引入的一个问题。
要解决此问题:
您可以恢复正在构建的 python 版本,或者如果您使用的是 docker,请使用 python:3.8.3-slim 或等效图像临时修复 python 图像。您也可以等到修复完成。
您可以在此处查看相关的拉取请求:https://github.com/python/cpython/pull/21473
这里介绍:https://bugs.python.org/issue39960
在这里修补错误:https://bugs.python.org/issue41295
不相关的包中的另一个问题是相同的错误:flask_sqlalchemy: error with `__setattr__` to `DefaultMeta`
Git 实验室 CI 使用 SqlAlchemy 运行鼻子测试。错误:失败:TypeError(无法将此 __setattr__ 应用于 DefaultMeta 对象)
编辑:引入修复程序的新版本已发布。查看 python:3.8.5 + 的任何图像。
是的,它似乎在较新的 python 版本上崩溃了。我将 python 版本降级到 3.8.2,它的效果非常好。
我最近遇到了同样的问题,并使用 pip install git+git://github.com/pallets/flask-sqlalchemy.git
修复了它有关此答案的完整详细信息可以从 kam193 的评论
获得我在 python 3.8.4 和 Flask-SQLAlchemy 2.4.1 中也遇到了这个问题。我使用 Tysonic 的答案将 Flask-SQLAlchemy 更新到 v3,但这只是在启动 Flask 时引入了新错误。
我能够通过使用 pip 卸载 Flask-SQLAlchemy 并再次安装来解决,这给我留下了 2.4.4 并且一切正常。我的版本:python 3.8.4、Flask-SQLAlchemy 2.4.4、Flask 1.1.2、SQLAlchemy 1.3.17。
3.11.4版本有错误!在 SPyder 中运行。
[打字扩展的自动重新加载失败:回溯(最近一次调用最后一次): 文件“C:\Users\jaske naconda3\Lib\site-packages\IPython xtensions utoreload.py”,第 273 行,检查 superreload(m, 重新加载, self.old_objects) 文件“C:\Users\jaske naconda3\Lib\site-packages\IPython xtensions utoreload.py”,第 496 行,在 superreload 中 update_generic(旧的_obj,新的_obj) 文件“C:\Users\jaske naconda3\Lib\site-packages\IPython xtensions utoreload.py”,第 393 行,位于 update_generic 更新(a,b) 文件“C:\Users\jaske naconda3\Lib\site-packages\IPython xtensions utoreload.py”,第 361 行,在 update_class 中 update_instances(旧的,新的) 文件“C:\Users\jaske naconda3\Lib\site-packages\IPython xtensions utoreload.py”,第 319 行,位于 update_instances 中 对象。setattr(参考,“class”,新) TypeError:无法将此 setattr 应用于 _TypedDictMeta 对象 ]