【问题标题】:Django: Context processors for error pages (or request in simple_tag)Django:错误页面的上下文处理器(或 simple_tag 中的请求)
【发布时间】:2018-02-01 10:16:23
【问题描述】:

在我的 Django 项目中,有几个 django 应用程序。我想编写自定义错误页面,并且我希望它们包含指向发生错误的应用程序的正确链接,例如,如果在我的应用程序a 中发生 500 错误,我希望错误页面包含指向/a/index.html,如果应用程序b 中发生服务器错误,我希望页面包含指向/b/index.html 的链接。而且我只想为每个错误页面文件创建一个副本,这意味着我需要从模板中获取应用程序的名称。

为此,我编写了一个自定义上下文处理器,将app_name 变量添加到模板中。我在正常页面上对其进行了测试,但是当我继续在错误页面上对其进行测试时,结果发现上下文处理器没有触发。

同样,我写了一个模板标签app_aware_url,它采用url模式的名称并尝试解决它,但同样,对于错误页面simple_tag(takes_context=True)接收的上下文不包含请求(用于告知我在哪个应用中)。

有没有办法解决它,还是有更好的解决方案来解决我的问题?

(Django 是 1.11)

【问题讨论】:

    标签: python django


    【解决方案1】:

    执行此操作的正确方法似乎是custom error handler。这方面的文档有点……轻?所以我必须做一些实验才能让它发挥作用。

    事实证明,这只能在全球范围内进行,在您的基础 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() 正在施展魔法。它检查请求的resolver_match - 它是通过urls 机器的路径,并根据它确定它所在的应用程序。

    从这里开始,天空就是极限。为方便起见,我只是将TemplateView 子类化,但如果您愿意,可以遵从django.views.defaults.server_error()。随心所欲。

    如果您想更多地动手,我已经整理了一个repo,(在撰写本文时提交b638f8),您可以随时查看并使用它。

    【讨论】:

    • 抱歉,我们最终从项目中删除了它。稍后我将尝试测试您的方法。如果它确实有效,我会很乐意接受它。
    【解决方案2】:

    对于那些可能踩到相同耙子的人: 我最终做的是将“app_name”变量从错误页面视图传递到上下文。因此,该变量位于非错误页面的上下文中,因为它是由上下文处理器设置的,并且它存在于错误页面中,因为它是手动传递的。不过看起来不是一个好的解决方案。

    【讨论】:

      猜你喜欢
      • 2022-08-24
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 2021-08-16
      • 2019-10-27
      • 2016-07-01
      • 1970-01-01
      • 2011-09-27
      相关资源
      最近更新 更多