Django 2.1.3 視圖層 內置視圖

裝飾器 | 總目錄


Django的幾個內置視圖記錄在 寫入視圖 以及文檔中的 其他位置。

1. 在開發中提供文件

static.serve(request, path, document_root, show_indexes=False)

除了項目的靜態資源之外,可能還有其他文件,爲方便起見,您希望Django在本地開發中爲您服務。serve()視圖可用於爲您給的任何目錄提供服務。(此視圖不會用於生產用途應僅用作開發輔助;您應使在生產中爲真正的Web服務器提供這些文件)。

最可能的例子是用戶上傳的內容目錄[ MEDIA_ROOT ] z(https://docs.djangoproject.com/en/2.1/ref/settings/#std:setting-MEDIA_ROOT)。 django.contrib.staticfiles適用於靜態資源,並且沒有內置的處理用戶上傳文件,但您可以讓Django 通過將MEDIA_ROOT這樣的內容附加到您的URLconf來爲您服務:

from django.conf import settings
from django.urls import re_path
from django.views.static import serve

# ... the rest of your URLconf goes here ...

if settings.DEBUG:
    urlpatterns += [
        re_path(r'^media/(?P<path>.*)$', serve, {
            'document_root': settings.MEDIA_ROOT,
        }),
    ]

請注意,該代碼段假定您MEDIA_URL的值爲 '/media/'。這將調用serve()視圖,從URLconf傳遞路徑參數和document_root(必需提供) 參數。

由於定義此URL模式可能會變得有點麻煩,因此Django附帶了一個小的URL幫助函數static() ,它將MEDIA_URL作爲prefix參數,任何其他函數參數將透明地傳遞給視圖。

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

2. 錯誤視圖

Django默認帶有幾個視圖來處理HTTP錯誤。要使用您自己的自定義視圖覆蓋這些視圖,請參閱 自定義錯誤視圖

404(找不到頁面)視圖

defaults.page_not_found(request, exception, template_name='404.html')

當您從視圖中拋出Http404異常,Django會加載一個專門用於處理404錯誤的特殊視圖。默認情況下,它是 django.views.defaults.page_not_found 視圖 ,它會生成一個非常簡單的“未找到”消息,或者如果您在根模板目錄中創建了404.html模板,則會加載並呈現模板。

默認的404視圖將兩個變量傳遞給模板:

  • request_path,這是導致錯誤的URL
  • exception,它是觸發視圖的異常的有用表示(例如,包含傳遞給特定Http404實例的任何消息)。

有關404視圖的三點注意事項:

  • 如果在檢查URLconf中的每個正則表達式後Django沒有找到匹配項,也會調用404視圖。
  • 404視圖傳遞一個RequestContext並且可以訪問模板上下文處理器提供的變量(例如MEDIA_URL)。
  • 如果DEBUG設置爲True(在您的設置文件中),那麼將永遠不會使用您的404視圖,而是會顯示您的URLconf以及一些調試信息。

500(服務器錯誤)視圖

defaults.server_error(request, template_name='500.html')

類似地,Django在視圖代碼中運行時錯誤的情況下執行特殊情況行爲。如果視圖導致異常,Django會調用默認django.views.defaults.server_error視圖,該視圖會生成一個非常簡單的“服務器錯誤”消息,或者如果您在根模板目錄中創建500.html模板,則加載並呈現模板。

默認的500視圖不會將任何變量傳遞給500.html模板,並使用空顯示Context以減少出現其他錯誤的可能性。

如果DEBUG設置爲True(在您的設置文件中),則永遠不會使用您的500視圖,而是顯示回溯,並顯示一些調試信息。

403(HTTP Forbidden)視圖

defaults.permission_denied(request, exception, template_name='403.html')

與404和500視圖一樣,Django可以處理403 Forbidden錯誤。如果視圖導致403異常,那麼Django默認會調用django.views.defaults.permission_denied視圖。

此視圖在根模板目錄中加載和呈現403.html模板,或者如果此文件不存在,則提供文本“403 Forbidden”,按照RFC 7231#section-6.5.3(HTTP 1.1規範)。模板上下文包含exception,它是觸發視圖的異常的字符串表示形式。

django.views.defaults.permission_deniedPermissionDenied異常觸發 。要拒絕在視圖中訪問,您可以使用以下代碼:

from django.core.exceptions import PermissionDenied

def edit(request, pk):
    if not request.user.is_staff:
        raise PermissionDenied
    # ...

400(錯誤請求)視圖

defaults.bad_request(request, exception, template_name='400.html')

當在Django中引發一個SuspiciousOperation異常時,它可以由Django的一個組件處理(例如重置會話數據)。如果沒有特別處理,Django會將當前請求視爲“錯誤請求”而不是服務器錯誤。

否則與server_error視圖非常相似 ,但返回狀態代碼400,表示錯誤條件是客戶端操作的結果。默認情況下,與觸發視圖的異常無關的任何內容都會傳遞給模板上下文,因爲異常消息可能包含敏感信息,如文件系統路徑。

bad_request視圖時也只用用在DEBUG=False的時候。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章