Шаблон Django не найден
У меня проблема с Django, из-за которой только иногда возникают проблемы с поиском шаблонов. Он будет работать нормально в течение нескольких часов, а затем вдруг не сможет обслуживать определенные шаблоны. Иногда проблема решается сама собой, но ее всегда можно исправить, нажав touch <template>
. Мое текущее решение - это cronjob, который выполняет touch <project root>
каждую минуту, и это работает, пока 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',
)
Ответы
Ответ 1
Так получается, что моя проблема была не в самом Django, а в моей среде. Я запускал сервер Django из ~/Django-проекта, и наш dev-сервер шифрует домашние каталоги после завершения всех сеансов, что означает, что служба больше не сможет его найти. Перемещение проекта в/var/и демонрование команды manage.py runningerver не позволило проекту избежать ошибок шаблона.
Ответ 2
Просто хотел добавить еще один случай, когда вы можете получить ошибку Template Does Not Exist
.
Убедитесь, что вы добавили приложение в переменную INSTALLED_APPS
внутри вашего файла settings.py
. Недостаточно команды 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 :)
]
Я знаю, что это глупо, но я знаю людей, которые потерпели неудачу в своем драйвере, потому что забывают пристегнуть ремень безопасности, поэтому забыть строку кода не так редко, как кажется.
Ответ 3
Попробуйте обновить свои настройки следующим образом:
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATE_DIRS = (os.path.join(PROJECT_ROOT, 'templates'),)
(Это стандартный способ получения BASE_DIR в django 1.8). До Python 3.4, __file__
не гарантирует абсолютный путь к файлу.
Вы также должны попробовать и остаться агностиком платформы, используя os.path.join, а не добавлять каталог в виде строки (другие платформы используют обратную косую черту).