Bladeren bron

normalize query params on all pages

Daniel Sheffield 1 jaar geleden
bovenliggende
commit
6cb319c512
1 gewijzigde bestanden met toevoegingen van 21 en 0 verwijderingen
  1. 21 0
      app/rest/pyapi.py

+ 21 - 0
app/rest/pyapi.py

@@ -78,12 +78,29 @@ def normalize_query(query: FormsDict, allow: Iterable[str] = None) -> str:
         (k, get_query_param(*param[k])) for k in sorted(param) if param[k]
     ])
 
+def _normalize_decorator(func, poison_on_reload=False):
+    def wrap(*args, **kwargs):
+        _, _, path, *_ = request.urlparts
+        normalized = normalize_query(request.query, allow=PARAMS)
+        if poison_on_reload and request.params.get('reload') == 'true':
+            CACHE.remove(normalized)
+        if request.query_string != normalized:
+            return redirect(f'{path}?{normalized}')
+        return func(*args, **kwargs)
+    return wrap
+
+def normalize(*args, **kwargs):
+    if not len(args):
+        return lambda f: _normalize_decorator(f, **kwargs)
+    
+    return _normalize_decorator(*args)
 
 @route('/grocery/static/<filename:path>')
 def send_static(filename):
     return static_file(filename, root='app/rest/static')
 
 @route('/grocery/trend')
+@normalize(poison_on_reload=True)
 def trend():
     _, _, path, *_ = request.urlparts
     normalized = normalize_query(request.query, allow=PARAMS)
@@ -103,6 +120,7 @@ def trend():
     ))
 
 @route('/grocery/groups')
+@normalize
 def groups():
     filters = get_filter(request.query, allow=('group', 'category', 'product'))
     form = template('form-nav', action='groups', method='get', params=[
@@ -129,6 +147,7 @@ FROM (
     return template("query-to-xml", title="Groups", xml=xml, form=form)
 
 @route('/grocery/categories')
+@normalize
 def categories():
     filters = get_filter(request.query, allow=('group', 'category', 'product'))
     form = template('form-nav', action='categories', method='get', params=[
@@ -155,6 +174,7 @@ FROM (
     return template("query-to-xml", title="Categories", xml=xml, form=form)
 
 @route('/grocery/products')
+@normalize
 def products():
     filters = get_filter(request.query, allow=('group', 'category', 'product'))
     form = template('form-nav', action='products', method='get', params=[
@@ -182,6 +202,7 @@ FROM (
     return template("query-to-xml", title="Products", xml=xml, form=form)
 
 @route('/grocery/tags')
+@normalize
 def tags():
     form = template('form-nav', action='tags', method='get', params=[
         {'name': k, 'value': request.params[k]} for k in request.params if k in PARAMS