我刚刚设置了 django 环境,正如教程所说。我打字python manager.py runserver
,它告诉我打开127.0.0.1:8000
。当我打开它时,它使用正确的欢迎页面。
但这是我的问题:谁生成了这个默认的欢迎页面?因为没有views.py
,urls.py
页面是空的。
我刚刚设置了 django 环境,正如教程所说。我打字python manager.py runserver
,它告诉我打开127.0.0.1:8000
。当我打开它时,它使用正确的欢迎页面。
但这是我的问题:谁生成了这个默认的欢迎页面?因为没有views.py
,urls.py
页面是空的。
如果你urls.py
是空的(因为不包含匹配 url 的模式)并且 Django 处于调试模式(DEBUG = True
在你的设置中),那么 Django 会触发你看到的页面。
Django 视图:
https://github.com/django/django/blob/main/django/views/debug.py#L575-L583
HTML 模板:
如果有人想取回它(或重用它),您只需将debug.default_urlconf
视图添加到您的urls
:
…
from django.views import debug
…
urlpatterns = [
…
path('', debug.default_urlconf),
…
]
看看django/core/handlers/base.py
和django/views/debug.py
。简而言之,如果 django 得到一个 404,如果你没有设置任何路由,那么它会在 base.py
if settings.DEBUG:
from django.views import debug
response = debug.technical_404_response(request, e)
在 debug.py 中查看technical_404_response
和empty_urlconf
(免责声明:我使用的是 django 版本:3.2.5,在旧版本中文件内容可能会有所不同)
第一次运行 django web 应用程序时看到的默认登录页面是“ default_urlconf.html ”。这是 django 添加的安全机制,而不是在没有任何默认 url/路由的情况下给出 404 错误。
当您第一次使用命令或使用任何 IDE 菜单控件(例如“Pycharm 专业人员”)创建 django 网站时django-admin startproject <project_name>
,您将获得以下文件夹结构。DEBUG = True
此外,Debug在您的 setting.py 文件中设置为 True ( )
此外,当未设置路由或 url.py 中的 url 映射为空时,django 框架通过其错误处理代码提供默认路由。这就像当您尝试访问/请求http://127.0.0.1:8000/时,django 检查该 url 是否存在(404)以及调试模式是否处于活动状态。这个请求会遍历各种 *.py 文件,比如base.py
, handlers.py
, exceptions.py
,最后到达debug.py
. 所有这些文件都随虚拟环境或您的那一刻提供(在您的项目中安装 django)。
最终,从“exception.py”通过方法进入“debug.py”**debug.technical_404_response(request, exc)**
def response_for_exception(request, exc):
if isinstance(exc, Http404):
if settings.DEBUG:
response = debug.technical_404_response(request, exc)
else:
response = get_exception_response(request, get_resolver(get_urlconf()), 404, exc)
最后,它会感觉到debug.py
有def technical_404_response(request, exception)
哪些调用def default_urlconf(request)
,并最终返回您在屏幕上看到的默认 html 页面 ( default_urlconf.html ) 的响应
def default_urlconf(request):
"""Create an empty URLconf 404 error response."""
with Path(CURRENT_DIR, 'templates', 'default_urlconf.html').open(encoding='utf-8') as fh:
t = DEBUG_ENGINE.from_string(fh.read())
c = Context({
'version': get_docs_version(),
})
return HttpResponse(t.render(c), content_type='text/html')
文件位置:
exception.py:venv/Lib/site-packages/django/core/handlers/exception.py _
debug.py:venv/Lib/site-packages/django/views/debug.py _
default_urlconf.html:venv/Lib/site-packages/django/views/templates/default_urlconf.html