找不到 Django 模板
Django Template Not Found
我有一个 Django 问题,只是偶尔会在查找模板时遇到问题。它会 运行 好几个小时,然后突然无法提供某些模板。有时问题会自行解决,但 总是 可以被 运行 touch <template>
解决。我当前的解决方案是每分钟执行 touch <project root>
的 cronjob,只要 cron 保持运行,它就可以工作。但是,我想找到一个合适的方法来解决我的问题。
相关设置:
PROJECT_ROOT = os.path.dirname(__file__)
APPS_ROOT = os.path.abspath(os.path.join(PROJECT_ROOT, "apps"))
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)
TEMPLATE_DIRS = (
(PROJECT_ROOT + '/templates'),
)
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.request",
"django.core.context_processors.i18n",
"django.contrib.messages.context_processors.messages",
"base_site.context_processors.app_list"
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
尝试像这样更新您的设置:
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATE_DIRS = (os.path.join(PROJECT_ROOT, 'templates'),)
(这是在 django 1.8 中获取 BASE_DIR 的默认方式)。在 Python 3.4 之前,__file__
不能保证给出绝对文件路径。
您还应该尝试使用 os.path.join 来保持平台不可知,而不是将目录添加为字符串(其他平台使用反斜杠)。
原来我的问题不是 Django 本身,而是我的环境。我是来自 ~/Django-project 的 运行 Django 服务器,一旦所有会话都注销,我们的开发服务器就会加密主目录,这意味着服务无法再找到它。将项目移动到 /var/ 并守护 manage.py runserver 命令使项目免受模板不存在错误的影响。
只是想添加另一种可能会出现 Template Does Not Exist
错误的情况。
确保您已将应用程序添加到 settings.py
文件中的 INSTALLED_APPS
变量中。 startapp
命令还不够。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myappname', # add your app here :)
]
我知道这很愚蠢,但我知道有人因为忘记系好安全带而未能通过驾驶考试,所以忘记一行代码并不像听起来那么罕见。
我有一个 Django 问题,只是偶尔会在查找模板时遇到问题。它会 运行 好几个小时,然后突然无法提供某些模板。有时问题会自行解决,但 总是 可以被 运行 touch <template>
解决。我当前的解决方案是每分钟执行 touch <project root>
的 cronjob,只要 cron 保持运行,它就可以工作。但是,我想找到一个合适的方法来解决我的问题。
相关设置:
PROJECT_ROOT = os.path.dirname(__file__)
APPS_ROOT = os.path.abspath(os.path.join(PROJECT_ROOT, "apps"))
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)
TEMPLATE_DIRS = (
(PROJECT_ROOT + '/templates'),
)
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.request",
"django.core.context_processors.i18n",
"django.contrib.messages.context_processors.messages",
"base_site.context_processors.app_list"
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
尝试像这样更新您的设置:
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATE_DIRS = (os.path.join(PROJECT_ROOT, 'templates'),)
(这是在 django 1.8 中获取 BASE_DIR 的默认方式)。在 Python 3.4 之前,__file__
不能保证给出绝对文件路径。
您还应该尝试使用 os.path.join 来保持平台不可知,而不是将目录添加为字符串(其他平台使用反斜杠)。
原来我的问题不是 Django 本身,而是我的环境。我是来自 ~/Django-project 的 运行 Django 服务器,一旦所有会话都注销,我们的开发服务器就会加密主目录,这意味着服务无法再找到它。将项目移动到 /var/ 并守护 manage.py runserver 命令使项目免受模板不存在错误的影响。
只是想添加另一种可能会出现 Template Does Not Exist
错误的情况。
确保您已将应用程序添加到 settings.py
文件中的 INSTALLED_APPS
变量中。 startapp
命令还不够。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myappname', # add your app here :)
]
我知道这很愚蠢,但我知道有人因为忘记系好安全带而未能通过驾驶考试,所以忘记一行代码并不像听起来那么罕见。