【问题标题】:Template not found by herokuheroku 找不到模板
【发布时间】:2018-06-26 14:30:12
【问题描述】:

我刚刚在 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(不包括根项目文件夹)。比较这两条路径,它们似乎并不指向同一件事。实际检查的第一个是缺少另一个步骤workoutbase.html 位于同一文件夹中。这是问题吗?我该如何解决?

【问题讨论】:

  • django 版本是多少?能否确保右视图中的template_name指向templates目录中的现有模板?
  • 2.0.不知道你的第二个问题是什么意思,伙计。
  • 在 django settings.py 中,TEMPLATES[x]['DIRS'] 是 django 应该查找模板的目录列表。它正在寻找的确切模板在 template_name 的视图中命名(对于 CBV)。因此,如果您的结构相似:templates/sth/my_template.html 意味着,您应该像这样配置您的视图:template_name=sth/my_template.html。你能确保它是正确的吗?
  • 请注意,回溯中提到了prompt_login - 您可能会发现,如果您在本地计算机上注销,则会收到类似的错误。
  • 由于你的设置是一个目录而不是一个文件,你可能需要在设置BASE_DIR时再添加一个os.path.dirname(),这样才能设置到项目目录下。

标签: django heroku


【解决方案1】:

遇到这个问题,发现在我的本地 Mac 上模板的文件名不区分大小写,而在 Heroku 上则区分大小写。

所以它在我的机器上工作,但在 Heroku 上抛出了 TemplateNotFound

components/react/ReactDOM.jsx 与 Mac 的 jinja 中的 components/react/ReactDom.jsx 相同,但在 linux (Heroku) 的 jinja 中则不同

【讨论】:

    【解决方案2】:

    您链接的问题已过时多年。从 Django 1.8 开始,您应该使用 TEMPLATES,而不是 TEMPLATE_* 设置。

    templates 目录添加到DIRS 选项。

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, "templates")],
            ...
        }
    ]
    

    这假定您的templates 目录位于项目目录中(包含manage 的目录)。看起来好像您的模板目录位于内部 workout 目录(包含设置的目录)中。因此,您可能希望在DIRS 中使用os.path.join(BASE_DIR, "workout", "templates")

    如果您想将模板保留在内部workout 目录中,那么另一种选择是将workout 添加到您的INSTALLED_APPS。然后应用程序目录加载器将找到您的锻炼模板,您将不需要 DIRS 中的条目。即使您这样做,使用DIRS 方法让您的TEMPLATES 工作也会很有用。例如,如果您的BASE_DIR 错误,则可能会导致您在其他地方出现问题。

    【讨论】:

    • 我照你说的做了,但并没有改变什么。我将我所做的确切更改放在问题的更新中。
    • 那么你需要做更多的调试。 workout/base.html 模板在哪里? os.path.join(BASE_DIR, "templates") 的评估结果是什么?他们是否匹配。也许这是一个锻炼/锻炼命名问题,就像您的许多问题一样。
    • 我做了一些调试并在更新中发布了结果。
    • os.path.join(BASE_DIR, "templates") 假定模板目录位于项目目录中。看起来好像您的模板位于内部目录中。
    • 您需要调整DIRS 设置(可能还有我在之前评论中提到的BASE_DIR,以便它与模板目录/path/to/workout/templates/ 匹配(忽略最后的workout/base.html,因为那是您在 {% extends %} 标记中指定的内容。首先在本地环境中运行会更容易,然后您将获得可以比较的绝对路径,而不是 /app/.../
    猜你喜欢
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2011-12-23
    • 2022-01-15
    • 2015-09-21
    相关资源
    最近更新 更多