我有一个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模板吗?如果是,如何?
感谢。
答案 0 :(得分:0)
在生产自动
中显示此显示500.html的错误raise KeyError
但是这种错误的方式,你永远不应该为用户引发例外。相反,您可以在视图中检查country
,如果它不存在,例如,在模板中为用户显示一些消息。