heroku找不到模板

时间:2018-01-17 16:24:36

标签: django heroku

我刚刚在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在我的项目中的位置:

enter image description here

那样就是workout/templates/workout/base.html(不计算根项目文件夹)。比较这两条路径,它们似乎没有指向相同的东西。实际上正在检查的第一个是缺少与workout位于同一文件夹中的另一个步骤base.html。这是问题吗?我该如何解决?

2 个答案:

答案 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中与