如何在Django项目顶层目录创建decorators.py供多应用调用?
解决Django跨应用导入顶层装饰器的问题
核心原因
你的相对导入报错根源:
from ..decorators试图跳出当前app的包层级,但项目根目录默认不是Python可识别的包(无__init__.py),因此触发跨顶层包的导入错误。from .decorators是在当前app目录下查找文件,自然找不到顶层的decorators.py。
快速解决办法(推荐绝对导入)
Django启动时会自动把manage.py所在的项目根目录加入Python的sys.path,直接用绝对导入即可:
在任意app的views.py中写入:
from decorators import student_required, teacher_required
确保你的项目结构符合以下形式(decorators.py与manage.py同级):
your_project/ manage.py decorators.py myapp1/ views.py myapp2/ views.py
更规范的替代方案
如果想避免根目录存放零散模块,可将decorators.py移到项目配置包下(与settings.py同级):
your_project/ manage.py your_project/ settings.py decorators.py myapp1/ views.py
此时导入方式改为:
from your_project.decorators import student_required, teacher_required
不推荐的临时应急方案
如果因特殊情况sys.path未包含项目根目录,可在views.py开头手动添加路径:
import sys import os # 将项目根目录加入sys.path sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from decorators import student_required, teacher_required
这种方式易引发路径冲突,仅建议临时测试使用。
内容的提问来源于stack exchange,提问作者Wincij
相关产品推荐
相关产品推荐

