diff options
| author | Jeremy Kersten <jke@odoo.com> | 2021-01-12 12:15:23 +0000 |
|---|---|---|
| committer | Jeremy Kersten <jke@odoo.com> | 2021-01-18 15:21:22 +0000 |
| commit | 6e87ee09e35f2e19426b59f40a46b1aa22375ec6 (patch) | |
| tree | ffbe26bcbe4692181de94f043c3ae4f4577a3a0b /addons | |
| parent | c1e7b8e3dd92e835637f3e6b5676739ec7500121 (diff) | |
[FIX] website: perf - add cache for is_multilang_url
Now we cache the result of matching url in router.
This code need to be merged in saas-14.1/master with url_rewrite,
but it required a change of api method
closes odoo/odoo#64362
Signed-off-by: Jérémy Kersten (jke) <jke@openerp.com>
Diffstat (limited to 'addons')
| -rw-r--r-- | addons/http_routing/models/ir_http.py | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/addons/http_routing/models/ir_http.py b/addons/http_routing/models/ir_http.py index fe06e0a849b..4ccf886efc0 100644 --- a/addons/http_routing/models/ir_http.py +++ b/addons/http_routing/models/ir_http.py @@ -196,7 +196,6 @@ def url_for(url_from, lang_code=None, no_rewrite=False): new_url = request.env['ir.http'].url_rewrite(path) new_url = new_url if not qs else new_url + '?%s' % qs - return url_lang(new_url or url_from, lang_code=lang_code) @@ -223,23 +222,17 @@ def is_multilang_url(local_url, lang_url_codes=None): return False query_string = url[1] if len(url) > 1 else None - router = request.httprequest.app.get_db_router(request.db).bind('') - - def is_multilang_func(func): - return (func and func.routing.get('website', False) and - func.routing.get('multilang', func.routing['type'] == 'http')) - # Try to match an endpoint in werkzeug's routing table try: - func = router.match(path, method='POST', query_args=query_string)[0] - return is_multilang_func(func) - except werkzeug.exceptions.MethodNotAllowed: - func = router.match(path, method='GET', query_args=query_string)[0] - return is_multilang_func(func) - except werkzeug.exceptions.NotFound: - return True - except Exception: + func = request.env['ir.http']._get_endpoint_qargs(path, query_args=query_string) + # /page/xxx has no endpoint/func but is multilang + return (not func or ( + func.routing.get('website', False) + and func.routing.get('multilang', func.routing['type'] == 'http') + )) + except Exception as exception: + _logger.warning(exception) return False @@ -582,7 +575,7 @@ class IrHttp(models.AbstractModel): code = exception.code values.update( - status_message=werkzeug.http.HTTP_STATUS_CODES.get(code,''), + status_message=werkzeug.http.HTTP_STATUS_CODES.get(code, ''), status_code=code, ) @@ -664,13 +657,32 @@ class IrHttp(models.AbstractModel): router = req.app.get_db_router(request.db).bind('') try: _ = router.match(path, method='POST') - except werkzeug.exceptions.MethodNotAllowed as e: + except werkzeug.exceptions.MethodNotAllowed: _ = router.match(path, method='GET') except werkzeug.routing.RequestRedirect as e: new_url = e.new_url[7:] # remove scheme - except werkzeug.exceptions.NotFound as e: + except werkzeug.exceptions.NotFound: new_url = path except Exception as e: raise e return new_url or path + + # merge with def url_rewrite in master/14.1 + @api.model + @tools.cache('path', 'query_args') + def _get_endpoint_qargs(self, path, query_args=None): + router = request.httprequest.app.get_db_router(request.db).bind('') + endpoint = False + try: + endpoint = router.match(path, method='POST', query_args=query_args) + except werkzeug.exceptions.MethodNotAllowed: + endpoint = router.match(path, method='GET', query_args=query_args) + except werkzeug.routing.RequestRedirect as e: + new_url = e.new_url[7:] # remove scheme + assert new_url != path + endpoint = self._get_endpoint_qargs(new_url, query_args) + endpoint = endpoint and [endpoint] + except werkzeug.exceptions.NotFound: + pass # endpoint = False + return endpoint and endpoint[0] |
