为什么Django模板加载器在生产中区分大小写,但在开发中不区分大小写

2024-03-28 14:28:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我在MacOs Catalina OS上使用manage.py runserver作为开发。我有一些模板适合我内置的基于类的视图。例如:

CuadroDeControl_detail.html                     LoteDeMedio_list.html                           TipoDeMedio_detail_tablaCuadros.html
CuadroDeControl_detail_resumen.html             LoteDeMedio_list_tabla.html                     TipoDeMedio_list.html
CuadroDeControl_detail_tablaMetodos.html        MetodoDeControl_detail.html                     TipoDeMedio_list_tabla.html
LoteDeMedio_confirm_delete.html                 MetodoDeControl_detail_resumen.html             dropdown_CuadroDeControl.html
LoteDeMedio_create.html                         TipoDeMedio_confirm_delete.html                 dropwdown_CuadroDeControl.html
LoteDeMedio_detail.html                         TipoDeMedio_detail.html
LoteDeMedio_detail_resumen.html                 TipoDeMedio_detail_resumen.html

以下是工作视图的示例:

class TipoDeMedioDetailView(AreaCalidadMixin, DashboardMixin,  DetailView):
         model = TipoDeMedio

请注意,我的视图没有显式地设置template_name。在我的作品中 环境,我所有的视图加载都很好。Django的模板加载器知道视图对应的模板是TipoDeMedio_detail.html

但是,在我的生产环境中,在Ubuntu 20.04.2 LTS x86_64 Linode VM上使用apache2mod_wsgi设置,模板加载器无法加载同一视图的模板,因为它使用所有小写字母搜索模板。以下是一个例子:

Request Method: GET
Request URL:    http://45.79.4.38/calidad/TipoDeMedio/lista
Django Version: 3.1.6
Exception Type: TemplateDoesNotExist
Exception Value:    
calidad/tipodemedio_list.html
Exception Location: /home/jonatan/django-app/venv/lib/python3.8/site-packages/django/template/loader.py, line 47, in select_template
Python Executable:  /home/jonatan/django-app/venv/bin/python
Python Version: 3.8.5
Python Path:    
['/home/jonatan/django-app/mysite',
 '/usr/lib/python38.zip',
 '/usr/lib/python3.8',
 '/usr/lib/python3.8/lib-dynload',
 '/home/jonatan/django-app/venv/lib/python3.8/site-packages']
Server time:    Mon, 21 Jun 2021 18:24:19 -0500
Template-loader postmortem

Django tried loading these templates, in this order:

Using engine django:
django.template.loaders.filesystem.Loader: /home/jonatan/django-app/mysite/templates/calidad/tipodemedio_list.html (Source does not exist)
django.template.loaders.app_directories.Loader: /home/jonatan/django-app/mysite/login/templates/calidad/tipodemedio_list.html (Source does not exist)
django.template.loaders.app_directories.Loader: /home/jonatan/django-app/venv/lib/python3.8/site-packages/django/contrib/admin/templates/calidad/tipodemedio_list.html (Source does not exist)
django.template.loaders.app_directories.Loader: /home/jonatan/django-app/venv/lib/python3.8/site-packages/django/contrib/auth/templates/calidad/tipodemedio_list.html (Source does not exist)

一个简单的修复方法是在我的每个CBV上手动指定我的template_name属性,并指向正确的区分大小写的模板名称(例如TipoDeMedio_detail.html。但是,我确实希望避免这种情况

我只是想了解环境之间行为变化的根本原因。这让我相信,在Django行为的其他方面,我也会遇到类似的问题


Tags: django视图模板apphomelibhtmltemplate
2条回答

MattRowbum向我指出APFS不区分大小写。我认为这是对行为变化的充分解释。

默认的Apple文件系统(APFS)不区分大小写。这意味着,在Mac开发过程中,Django能够找到模板,即使文件名的大小写不正确

现在您已经迁移到Ubuntu,它默认使用区分大小写的文件系统。如果案例错误,Django无法找到模板

注意Django docs for class-based generic views状态:

... in the absence of an explicit template Django will infer one from the object’s name ... is the lowercased version of the model’s name.

更好的解决方案是使用小写字母重命名模板

相关问题 更多 >