iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0
自我挑戰組

打掉重練!Django的還債之旅~系列 第 3

Day03. Django的預設頁面跑哪去啦!?

  • 分享至 

  • xImage
  •  

前情提要

接續昨天做了一個非常簡易版的Hello World!頁面,發現我們的Django預設頁面消失了,究竟發生什麼事情了呢!?今天就依照我的直覺來一步一步猜測其中的原因吧!!

開始通靈

來觀察一下,什麼情況下預設頁面會存在,而什麼情況下不會存在呢?
首先當我們都還沒做任何修改的時候預設頁面是存在的,而當我們新增一個hello就不見了,會不會是path把根路徑覆蓋掉了?

我們把path改一下看看

path('', hello)
# 改成
path('hello/', hello)

https://ithelp.ithome.com.tw/upload/images/20230918/20162905du3tmI22Qf.png
摁~跳出了404 Page not found呢

那我們回復原本的情況讓path只有預設的呢肯定會出來的吧

urlpatterns = [
    path('admin/', admin.site.urls),
    # path('hello/', hello), 
]

https://ithelp.ithome.com.tw/upload/images/20230918/20162905WdizQnZl82.png
跟我們預期的一樣呢

再來把預設的admin改成hello呢

urlpatterns = [
    path('admin/', hello),
    # path('hello/', hello), 
]

https://ithelp.ithome.com.tw/upload/images/20230918/20162905bygwNBHDec.png
預設的改成hello也是會出404

把預設的admin刪掉呢

urlpatterns = [
    # path('admin/', hello),
    # path('hello/', hello), 
]

https://ithelp.ithome.com.tw/upload/images/20230918/201629052PYuQWG9eq.png
摁~預設頁面有跳出來

這邊可以先下一個結論
預設頁面會在urlpatterns這個list是空的或是只有預設的admin才會存在

接下來預設頁面中有提供一個很重要的線索
https://ithelp.ithome.com.tw/upload/images/20230918/20162905dCnTEliZPg.png
那就是在settings file 裡的DEBUG = True 的時候才會有這個預設畫面

嘗試的驗證一下

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
# 改成
DEBUG = False

這樣會跳
https://ithelp.ithome.com.tw/upload/images/20230918/20162905xKIfN2eXQA.png
修一下

ALLOWED_HOSTS = []
# 改成
ALLOWED_HOSTS = ['*']

https://ithelp.ithome.com.tw/upload/images/20230918/201629053yZYtywFH4.png
摁~說的沒錯,變成DEBUG = False就變not found了

通靈結束

至此可以下一個總結了
預設頁面要出現的條件如下

  • settings.py 中的DEBUG一定要等於True
  • 預設的urls.py中的urlpatterns的list要為空或預設的admin
    如果沒有滿足的話會跳出404

開挖

線索都有了就往原始碼挖吧!
先找看看有沒有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檔案
https://ithelp.ithome.com.tw/upload/images/20230918/20162905qH1s2d9wDg.png
到這邊任務就結束了,當中一定會有很多疑問那就留到之後的日子慢慢研究吧!

至於你問為什麼要找預設頁面呢?
我只能回答"阿我就突然一個好奇,怕是沒找到晚上會睡不好~"
/images/emoticon/emoticon70.gif


上一篇
Day02. Hello World !
下一篇
Day04. 所以說runserver,阿server怎麼run的!?part.1
系列文
打掉重練!Django的還債之旅~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言