kitto_plus报错:AttributeError: module ‘kotti_plus‘ has no attribute ‘security‘

报错:

kotti-plus serve development.ini

/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/pyramid/asset.py:2: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.

import pkg_resources

/mnt/g/traework/kottiplus/src/kotti_plus/models/init.py:425: SAWarning: Implicitly combining column nodes.title with column contents.title under attribute 'title'. Please configure one or more attributes for these same-named columns explicitly.

class Content(Node):

Traceback (most recent call last):

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/pyramid/path.py", line 393, in _zope_dottedname_style

found = getattr(found, n)

^^^^^^^^^^^^^^^^^

AttributeError: module 'kotti_plus' has no attribute 'security'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

File "/mnt/g/traework/kottiplus/.ub24venv/bin/kotti-plus", line 8, in <module>

sys.exit(main())

^^^^^^

File "/mnt/g/traework/kottiplus/src/kotti_plus/cli.py", line 167, in main

return args.func(args)

^^^^^^^^^^^^^^^

File "/mnt/g/traework/kottiplus/src/kotti_plus/cli.py", line 132, in serve

return pserve_main(argv)

^^^^^^^^^^^^^^^^^

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/pyramid/scripts/pserve.py", line 30, in main

return command.run()

^^^^^^^^^^^^^

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/pyramid/scripts/pserve.py", line 272, in run

app = loader.get_wsgi_app(app_name, config_vars)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/plaster_pastedeploy/init.py", line 111, in get_wsgi_app

return loadapp(

^^^^^^^^

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/paste/deploy/loadwsgi.py", line 246, in loadapp

return loadobj(APP, uri, name=name, **kw)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/paste/deploy/loadwsgi.py", line 271, in loadobj

return context.create()

^^^^^^^^^^^^^^^^

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/paste/deploy/loadwsgi.py", line 738, in create

return self.object_type.invoke(self)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/paste/deploy/loadwsgi.py", line 136, in invoke

return fix_call(context.object, context.global_conf, **context.local_conf)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/paste/deploy/util.py", line 61, in fix_call

val = callable(*args, **kw)

^^^^^^^^^^^^^^^^^^^^^

File "/mnt/g/traework/kottiplus/src/kotti_plus/init.py", line 150, in main

config = base_configure(global_config, **settings)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/mnt/g/traework/kottiplus/src/kotti_plus/init.py", line 174, in base_configure

settings = resolve_dotted(settings)

^^^^^^^^^^^^^^^^^^^^^^^^

File "/mnt/g/traework/kottiplus/src/kotti_plus/init.py", line 135, in resolve_dotted

new_value.append(resolver.resolve(dottedname))

^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/pyramid/path.py", line 309, in resolve

return self._resolve(dotted, package)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/pyramid/path.py", line 336, in _resolve

return self._zope_dottedname_style(dotted, package)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/pyramid/path.py", line 395, in _zope_dottedname_style

import(used)

File "/mnt/g/traework/kottiplus/src/kotti_plus/security.py", line 94, in <module>

"role:viewer": Principal("role:viewer", title="Viewer"),

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "<string>", line 4, in init

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/sqlalchemy/orm/state.py", line 596, in _initialize_instance

with util.safe_reraise():

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 121, in exit

raise exc_value.with_traceback(exc_tb)

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/sqlalchemy/orm/state.py", line 594, in _initialize_instance

manager.original_init(*mixed[1:], **kwargs)

File "/mnt/g/traework/kottiplus/src/kotti_plus/security.py", line 84, in init

self.groups = groups or []

^^^^^^^^^^^

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 540, in set

self.impl.set(

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1287, in set

value = self.fire_replace_event(

^^^^^^^^^^^^^^^^^^^^^^^^

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1302, in fire_replace_event

value = fn(

^^^

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/sqlalchemy/orm/events.py", line 2560, in wrap

return fn(target, *arg)

^^^^^^^^^^^^^^^^

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/sqlalchemy/ext/mutable.py", line 555, in set_

value = cls.coerce(key, value)

^^^^^^^^^^^^^^^^^^^^^^

File "/mnt/g/traework/kottiplus/src/kotti_plus/sqla.py", line 121, in coerce

return Mutable.coerce(key, value)

^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/mnt/g/traework/kottiplus/.ub24venv/lib/python3.12/site-packages/sqlalchemy/ext/mutable.py", line 473, in coerce

raise ValueError(msg % (key, type(value)))

ValueError: Attribute 'groups' does not accept objects of type <class 'list'>

AI说

这个错误表明在尝试加载 Kotti Plus 应用时,Python 无法找到 kotti_plus.security 模块。以下是解决这个问题的步骤:

1. 检查 Kotti Plus 安装

首先确认 Kotti Plus 是否正确安装,并且包含 security 模块。在终端中运行:

复制代码

Bash

python -c "import kotti_plus; print(kotti_plus.__file__)"

这会显示 Kotti Plus 的安装路径。检查该目录下是否存在 security.pysecurity/ 子目录。

2. 检查 development.ini 配置

打开 development.ini 文件,查找所有引用 kotti_plus.security 的配置项(如 kotti.includespyramid.includes 等)。确保这些引用的模块路径正确。例如:

复制代码

TOML, also INI

# 错误示例(如果 security 模块不存在) kotti.includes = kotti_plus.security # 正确做法:注释掉或修正路径 # kotti.includes = kotti_plus.security

3. 验证 Kotti Plus 版本

确保你使用的 Kotti Plus 版本支持 security 模块。查阅官方文档或更新到最新版本:

复制代码

Bash

pip install --upgrade kotti_plus

4. 检查 Python 路径

确认你的虚拟环境已激活,并且 Python 路径包含 Kotti Plus 的安装目录。在终端中运行:

复制代码

Bash

which python # 应指向虚拟环境中的 Python python -c "import sys; print(sys.path)" # 检查是否包含 kotti_plus 路径

5. 重新安装依赖

可能依赖项未正确安装。尝试重新安装:

复制代码

Bash

pip install -e . # 在 kotti_plus 项目根目录下运行

6. 检查代码兼容性

Kotti Plus 可能不支持 Python 3.12。尝试使用 Python 3.11 或更低版本:

复制代码

Bash

# 使用 pyenv 安装 Python 3.11 pyenv install 3.11.7 pyenv local 3.11.7

然后重新创建虚拟环境并安装依赖。

7. 查看官方文档/Issue

查阅 Kotti Plus 的官方文档或 GitHub Issues,确认是否有已知的兼容性问题。可能需要应用特定补丁或配置。

8. 临时解决方案

如果问题仅由缺失的 security 模块引起,且该模块非核心功能,可以尝试创建一个空的 security.py 文件(不推荐长期使用):

复制代码

Bash

touch /path/to/kotti_plus/security.py

总结

优先检查 development.ini 中的配置Kotti Plus 的安装完整性 。多数情况下,问题源于配置错误或版本不兼容。如果问题依旧,请提供更多上下文(如 development.ini 内容和 Kotti Plus 版本)。

Trae做的操作

让我分析一下:

  1. 从 LS 命令的结果中,我可以看到``security.py`` 文件确实存在于``g:\traework\kottiplus\src\kotti_plus\`` 目录中。

  2. 从``init.py`` 文件中,我可以看到它引用了``kotti_plus.security`` 模块,例如在第 25-27 行和第 56 行。

但是,在``init.py`` 文件中,我没有看到对``security`` 模块的显式导入。这可能是问题所在。在 Python 中,如果你想从包的顶层访问一个子模块,你需要在包的``init.py`` 文件中导入它。

让我检查一下``security.py`` 文件的内容,确保它是一个有效的模块:

.....

现在我看到问题了。从错误信息和代码分析来看,问题是在运行``kotti-plus serve development.ini`` 时出现了``AttributeError: module 'kotti_plus' has no attribute 'security'`` 错误。

让我分析一下可能的原因:

1. 首先,我检查了``g:\traework\kottiplus\src\kotti_plus`` 目录,确认``security.py`` 文件确实存在,并且有正确的内容。
2. 然后,我检查了``kotti_plus/init.py`` 文件,发现它没有显式地导入``security`` 模块,也没有在``all`` 变量中包含``security`` 。
3. 我还检查了``resources.py`` 文件,它从``kotti_plus.models`` 导入了模型,而不是从``kotti_plus.security`` 导入。
4. 从错误信息来看,问题出现在``kotti_plus/views/login.py`` 文件的第16行,它尝试从``kotti_plus import security`` 。

最终问题解决

相关推荐
We་ct2 小时前
LeetCode 201. 数字范围按位与:位运算高效解题指南
开发语言·前端·javascript·算法·leetcode·typescript
程序员榴莲2 小时前
Java(十二)抽象类
java·开发语言
蜡笔小马2 小时前
01.[特殊字符] 构建你的第一个 AI 智能体:从 DeepSeek 到结构化对话
人工智能·python·langchain
木子欢儿2 小时前
在 Fedora 上配置 Go 语言(Golang)开发环境
开发语言·后端·golang
BUG_MeDe2 小时前
从Json对象中提取某个对象的一点注意--libjson-c
linux·json
超级大只老咪2 小时前
线性递推通用模板
java·开发语言·算法
Dream of maid2 小时前
Python基础 6 (面向对象)
开发语言·python
郝学胜-神的一滴2 小时前
「栈与缩点的艺术」二叉树前序序列化合法性判定:从脑筋急转弯到工程实现
java·开发语言·数据结构·c++·python·算法
坚持就完事了2 小时前
Linux的which命令
linux·运维·服务器