[IMP] error handling in website.render

Return responses with the correct status code instead of always
returning 200 on rendering errors from website.

bzr revid: xmo@openerp.com-20131104111021-inrsbawnakhsva1q
This commit is contained in:
Xavier Morel 2013-11-04 12:10:21 +01:00
parent fb8991d404
commit 49381094a8
2 changed files with 28 additions and 22 deletions

View File

@ -124,11 +124,8 @@ class Website(openerp.addons.web.controllers.main.Home):
values = {
'path': path,
}
try:
html = request.website.render(path, values)
except ValueError:
html = request.website.render('website.404', values)
return html
return request.website.render(path, values)
@website.route('/website/customize_template_toggle', type='json', auth='user')
def customize_template_set(self, view_id):

View File

@ -1,22 +1,24 @@
# -*- coding: utf-8 -*-
import fnmatch
import functools
import logging
import math
import simplejson
import openerp
from openerp.osv import osv, fields
from openerp.addons.web import http
from openerp.addons.web.http import request
import traceback
import urllib
from urlparse import urljoin
import math
import traceback
from openerp.tools.safe_eval import safe_eval
from openerp.exceptions import AccessError, AccessDenied
import werkzeug
from openerp.addons.base.ir.ir_qweb import QWebException
import logging
import werkzeug
import werkzeug.exceptions
import werkzeug.wrappers
import openerp
from openerp.exceptions import AccessError, AccessDenied
from openerp.osv import osv, fields
from openerp.tools.safe_eval import safe_eval
from openerp.addons.web import http
from openerp.addons.web.http import request
logger = logging.getLogger(__name__)
def route(routes, *route_args, **route_kwargs):
@ -179,8 +181,7 @@ class website(osv.osv):
try:
view_ref = IMD.get_object_reference(cr, uid, module, xmlid)
except ValueError:
logger.error("Website Rendering Error.\n\n%s" % traceback.format_exc())
return self.render(cr, uid, ids, 'website.404', qweb_context)
return self.error(cr, uid, 404, qweb_context, context=context)
if 'main_object' not in qweb_context:
try:
@ -197,15 +198,23 @@ class website(osv.osv):
logger.error(err)
qweb_context['error'] = err[1]
logger.warn("Website Rendering Error.\n\n%s" % traceback.format_exc())
return self.render(cr, uid, ids, 'website.401', qweb_context)
return self.error(cr, uid, 401, qweb_context, context=context)
except Exception, e:
qweb_context['template'] = getattr(e, 'qweb_template', '')
node = getattr(e, 'qweb_node', None)
qweb_context['node'] = node and node.toxml()
qweb_context['expr'] = getattr(e, 'qweb_eval', '')
qweb_context['traceback'] = traceback.format_exc()
logger.error("Website Rendering Error.\n%(template)s\n%(expr)s\n%(node)s\n\n%(traceback)s" % qweb_context)
return view.render(cr, uid, 'website.500' if qweb_context['editable'] else 'website.404', qweb_context, context=context)
logger.exception("Website Rendering Error.\n%(template)s\n%(expr)s\n%(node)s" % qweb_context)
return self.error(cr, uid, 500 if qweb_context['editable'] else 404,
qweb_context, context=context)
def error(self, cr, uid, code, qweb_context, context=None):
View = request.registry['ir.ui.view']
return werkzeug.wrappers.Response(
View.render(cr, uid, 'website.%d' % code, qweb_context),
status=code,
content_type='text/html;charset=utf-8')
def pager(self, cr, uid, ids, url, total, page=1, step=30, scope=5, url_args=None):
# Compute Pager