接續昨天做了一個非常簡易版的Hello World!頁面,發現我們的Django預設頁面消失了,究竟發生什麼事情了呢!?今天就依照我的直覺來一步一步猜測其中的原因吧!!
來觀察一下,什麼情況下預設頁面會存在,而什麼情況下不會存在呢?
首先當我們都還沒做任何修改的時候預設頁面是存在的,而當我們新增一個hello就不見了,會不會是path把根路徑覆蓋掉了?
我們把path改一下看看
path('', hello)
# 改成
path('hello/', hello)
摁~跳出了404 Page not found呢
那我們回復原本的情況讓path只有預設的呢肯定會出來的吧
urlpatterns = [
path('admin/', admin.site.urls),
# path('hello/', hello),
]
跟我們預期的一樣呢
再來把預設的admin改成hello呢
urlpatterns = [
path('admin/', hello),
# path('hello/', hello),
]
預設的改成hello也是會出404
把預設的admin刪掉呢
urlpatterns = [
# path('admin/', hello),
# path('hello/', hello),
]
摁~預設頁面有跳出來
這邊可以先下一個結論
預設頁面會在urlpatterns這個list是空的或是只有預設的admin才會存在
接下來預設頁面中有提供一個很重要的線索
那就是在settings file 裡的DEBUG = True 的時候才會有這個預設畫面
嘗試的驗證一下
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
# 改成
DEBUG = False
這樣會跳
修一下
ALLOWED_HOSTS = []
# 改成
ALLOWED_HOSTS = ['*']
摁~說的沒錯,變成DEBUG = False就變not found了
至此可以下一個總結了
預設頁面要出現的條件如下
線索都有了就往原始碼挖吧!
先找看看有沒有debug相關的程式碼
順利的在django.views中找到debug.py
在裡面搜尋一下404 或 default 就會看到
def technical_404_response(request, exception):
"""Create a technical 404 error response. `exception` is the Http404."""
try:
error_url = exception.args[0]["path"]
except (IndexError, TypeError, KeyError):
error_url = request.path_info[1:] # Trim leading slash
try:
tried = exception.args[0]["tried"]
except (IndexError, TypeError, KeyError):
resolved = True
tried = request.resolver_match.tried if request.resolver_match else None
else:
resolved = False
if not tried or ( # empty URLconf
request.path == "/"
and len(tried) == 1
and len(tried[0]) == 1 # default URLconf
and getattr(tried[0][0], "app_name", "")
== getattr(tried[0][0], "namespace", "")
== "admin"
):
return default_urlconf(request)
urlconf = getattr(request, "urlconf", settings.ROOT_URLCONF)
if isinstance(urlconf, types.ModuleType):
urlconf = urlconf.__name__
with builtin_template_path("technical_404.html").open(encoding="utf-8") as fh:
t = DEBUG_ENGINE.from_string(fh.read())
reporter_filter = get_default_exception_reporter_filter()
c = Context(
{
"urlconf": urlconf,
"root_urlconf": settings.ROOT_URLCONF,
"request_path": error_url,
"urlpatterns": tried,
"resolved": resolved,
"reason": str(exception),
"request": request,
"settings": reporter_filter.get_safe_settings(),
"raising_view_name": get_caller(request),
}
)
return HttpResponseNotFound(t.render(c))
def default_urlconf(request):
"""Create an empty URLconf 404 error response."""
with builtin_template_path("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))
完美的找到了預設面頁在哪裡出現了
再根據上面原始碼中找到關鍵字default_urlconf.html再下去找,可以在django.views這個資料夾中的templates裡面找到一些django預設的html檔案
到這邊任務就結束了,當中一定會有很多疑問那就留到之後的日子慢慢研究吧!
至於你問為什麼要找預設頁面呢?
我只能回答"阿我就突然一個好奇,怕是沒找到晚上會睡不好~"