簡體   English   中英

Django:錯誤頁面的上下文處理器(或simple_tag中的請求)

[英]Django: Context processors for error pages (or request in simple_tag)

在我的Django項目中,有幾個django應用程序。 我想編寫自定義錯誤頁面,並且希望它們包含指向錯誤發生的應用程序的正確鏈接,例如,如果我的應用程序a發生了500錯誤,我希望錯誤頁面包含指向/a/index.html的鏈接/a/index.html ,如果應用b發生服務器錯誤,我希望頁面包含指向/b/index.html的鏈接。 而且我只希望為每個錯誤頁面文件創建一個副本,這意味着我需要從模板中獲取應用程序的名稱。

為此,我編寫了一個自定義上下文處理器,將app_name var添加到模板中。 我在正常頁面上對其進行了測試,但是當我繼續在錯誤頁面上對其進行測試時,結果表明上下文處理器未啟動。

同樣,我編寫了一個模板標簽app_aware_url ,該標簽使用url模式的名稱並嘗試對其進行解析,但是同樣,對於錯誤頁面, simple_tag(takes_context=True)接收的上下文不包含請求(告訴我我在哪個應用程序時需要使用哪個)。

有沒有解決的辦法,還是完全可以解決我的問題?

(Django是1.11)

正確的方法似乎是自定義錯誤處理程序 關於這個的文檔有點...輕嗎? 因此,我必須做一些實驗才能使其正常工作。

事實證明,這只能在基本urls.py全局進行,因此您不能為特定應用定制一個(很可惜),但是您可以從請求中得出該應用。

在您的基本urls.py

from .views import ErrorHandler


handler500 = lambda request: ErrorHandler.as_view()(request)

現在,每發生500個事件,這將推遲到views.ErrorHandler

class ErrorHandler(TemplateView):
    template_name = '500.html'

    def get_app_name(self):
        module = self.request.resolver_match.func.__module__
        app, *path = module.split('.')

        return app

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)

        context['app_name'] = self.get_app_name()

        return context

在這里, .get_app_name()正在.get_app_name() 它檢查請求的resolver_match它通過urls路徑的路徑,並根據該路徑確定它在哪個應用程序中。

從這里開始,天空才是極限。 為了簡便起見,我僅將TemplateView子類化,但是如果需要,可以將其推遲到django.views.defaults.server_error() 隨心所欲。

如果您想更多地動手,我已經整理了一個repo ,(在撰寫本文時請提交b638f8 ),您可以隨時檢查並了解更多內容。

對於那些可能會犯同樣錯誤的人:我最終要做的是將錯誤頁面視圖中的“ app_name”變量傳遞給上下文。 因此,該變量在非錯誤頁面的上下文中,因為它是由上下文處理器設置的,而在錯誤頁面中則是變量,因為它是手動傳遞的。 雖然看起來不是一個好的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM