从功能而不是视图将用户重定向到Django 500错误页面?

时间:2016-08-22 14:11:40

标签: django django-views

我有一个Django视图,用于在用户的会话中查找变量,如果找不到该变量,则会引发500错误并将用户重定向到我的自定义'项目/模板/ 500.html'页。

# views.py
def process_country(request, template):
    try:
        country = request.session['country']
    except KeyError as e:
        msg = "Key %s not found for uid %s" % ('country', request.user.id)
        log.error(msg, exc_info=True)
        return render(request, '500.html', status=500)

    if request.method == "POST":
        # do stuff...
        pass
    else:
        form = MyForm(initial={'country': country})
    context = {'form': form}
    return render(request, template, context)

如果'国家'该视图符合预期。会话变量不存在。但是,我想要做的是将这个丑陋的异常处理代码块移动到辅助函数:

# views.py
from utils import get_from_session
def process_country(request, template):
    country = get_from_session(request, 'country')  # Helper
    if request.method == "POST":
        # do stuff...
        pass
    else:
        form = MyForm(initial={'country': country})
    context = {'form': form}
    return render(request, template, context)

# utils.py
from django.shortcuts import render
def get_from_session(request, key):
    try:
        value = request.session[key]
        return value
    except KeyError as e:
        msg = "Key %s not found for uid %s" % (key, request.user.id)
        log.error(msg, exc_info=True)
        # Neither of these work!
        #return render(request, '500.html', status=500)
        #render(request, '500.html')

问题是,在第二个版本中,用户无法重定向到自定义500.html错误页面。相反,Django显示传递给process_country视图的模板,但它嵌入了该模板中500.html页面中包含的原始HTML。我想我可以做一个HttpResponseRedirect(反向(' 500页'))但这需要创建一个视图,它并不是一个合适的解决方案。这里发生了什么?我可以将用户从某个功能重定向到自定义500.html模板吗?如果是,如何?

感谢。

1 个答案:

答案 0 :(得分:0)

在生产自动

中显示此显示500.html的错误
raise KeyError 

但是这种错误的方式,你永远不应该为用户引发例外。相反,您可以在视图中检查country,如果它不存在,例如,在模板中为用户显示一些消息。