我刚刚在Heroku上部署了我的Django网站,但我得到了TemplateNotFoundError
:
Traceback (most recent call last):
2018-01-17T16:17:41.010548+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner
2018-01-17T16:17:41.010548+00:00 app[web.1]: response = get_response(request)
2018-01-17T16:17:41.010549+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 128, in _get_response
2018-01-17T16:17:41.010550+00:00 app[web.1]: response = self.process_exception_by_middleware(e, request)
2018-01-17T16:17:41.010551+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
2018-01-17T16:17:41.010551+00:00 app[web.1]: response = wrapped_callback(request, *callback_args, **callback_kwargs)
2018-01-17T16:17:41.010552+00:00 app[web.1]: File "/app/workoutcal/views.py", line 51, in redirect_to_calendar
2018-01-17T16:17:41.010553+00:00 app[web.1]: return calendar(request, year = today.year, month = today.month)
2018-01-17T16:17:41.010554+00:00 app[web.1]: File "/app/workoutcal/views.py", line 56, in calendar
2018-01-17T16:17:41.010554+00:00 app[web.1]: return prompt_login(request)
2018-01-17T16:17:41.010555+00:00 app[web.1]: File "/app/workoutcal/views.py", line 286, in prompt_login
2018-01-17T16:17:41.010556+00:00 app[web.1]: return render(request, 'workoutcal/prompt_login.html')
2018-01-17T16:17:41.010556+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/shortcuts.py", line 36, in render
2018-01-17T16:17:41.010557+00:00 app[web.1]: content = loader.render_to_string(template_name, context, request, using=using)
2018-01-17T16:17:41.010558+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/template/loader.py", line 62, in render_to_string
2018-01-17T16:17:41.010559+00:00 app[web.1]: return template.render(context, request)
2018-01-17T16:17:41.010559+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/template/backends/django.py", line 63, in render
2018-01-17T16:17:41.010560+00:00 app[web.1]: reraise(exc, self.backend)
2018-01-17T16:17:41.010561+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/template/backends/django.py", line 84, in reraise
2018-01-17T16:17:41.010561+00:00 app[web.1]: raise new from exc
2018-01-17T16:17:41.010565+00:00 app[web.1]: django.template.exceptions.TemplateDoesNotExist: workout/base.html
我已经完成了this回答中建议的内容:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATE_DIRS = (
os.path.join(BASE_DIR, "templates"),
)
但它没有帮助。
这里有什么问题?
PS:我的本地机器上的一切正常。 (更新:这不是真的,因为我在本地使用其他设置文件。我的不好。)
更新:
改为:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, "templates")],
}
]
同样的问题仍然存在。
更新2 :
我把它放在设置中:
path = os.path.join(BASE_DIR, "templates")
print("\n\n\n\n\n\nHERE'S THE PATH: "+str(path))
它产生了这个:
HERE'S THE PATH: /app/workout/templates
我不知道这是否是模板文件驻留在Heroku中的位置。我怎么检查?
以下是base.html在我的项目中的位置:
那样就是workout/templates/workout/base.html
(不计算根项目文件夹)。比较这两条路径,它们似乎没有指向相同的东西。实际上正在检查的第一个是缺少与workout
位于同一文件夹中的另一个步骤base.html
。这是问题吗?我该如何解决?
答案 0 :(得分:0)
您链接的问题是过时的岁月。从Django 1.8开始,您应该使用TEMPLATES
,而不是TEMPLATE_*
设置。
将templates
目录添加到DIRS
选项。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, "templates")],
...
}
]
这假设您的templates
目录位于项目目录(包含manage的目录)中。看起来您的模板目录位于内部workout
目录(包含设置的目录)中。因此,您需要在os.path.join(BASE_DIR, "workout", "templates")
中使用DIRS
。
如果要将模板保留在内部workout
目录中,则另一个选项是将workout
添加到INSTALLED_APPS
。然后app目录加载器将找到您的锻炼模板,您不再需要DIRS
中的条目。即使您这样做,使用TEMPLATES
方法让DIRS
工作也很有用。例如,如果您的BASE_DIR
错误,那么它可能会导致您在其他地方出现问题。
答案 1 :(得分:0)
出现此问题,发现在我的本地Mac上,模板的文件名不区分大小写,而在Heroku上,文件名区分大小写。
所以它可以在我的机器上运行,但是在Heroku上抛出了TemplateNotFound
。
components/react/ReactDOM.jsx
在Mac的jinja中与components/react/ReactDom.jsx
相同,而在linux(Heroku)的jinja中与{>