Add decorators.give_theme_cookie to decouple from render_template.
I realized it was not appropriate for render_template to be handling this responsibility, but previously did not think of another way. Now I did.
This commit is contained in:
parent
1554b86c11
commit
7f8a007e2d
2 changed files with 26 additions and 15 deletions
|
@ -66,6 +66,7 @@ def decorate_and_route(*route_args, **route_kwargs):
|
|||
# same one multiple times. The _fully_decorated will track that.
|
||||
if not hasattr(endpoint, '_fully_decorated'):
|
||||
endpoint = flasktools.ensure_response_type(endpoint)
|
||||
endpoint = decorators.give_theme_cookie(endpoint)
|
||||
endpoint = decorators.catch_etiquette_exception(endpoint)
|
||||
endpoint = session_manager.give_token(endpoint)
|
||||
|
||||
|
@ -162,10 +163,7 @@ def back_url():
|
|||
|
||||
def render_template(request, template_name, **kwargs):
|
||||
session = session_manager.get(request)
|
||||
|
||||
old_theme = request.cookies.get('etiquette_theme', None)
|
||||
new_theme = request.args.get('theme', None)
|
||||
theme = new_theme or old_theme or 'slate'
|
||||
theme = request.cookies.get('etiquette_theme', None)
|
||||
|
||||
response = flask.render_template(
|
||||
template_name,
|
||||
|
@ -174,17 +172,6 @@ def render_template(request, template_name, **kwargs):
|
|||
theme=theme,
|
||||
**kwargs,
|
||||
)
|
||||
|
||||
if not isinstance(response, flasktools.RESPONSE_TYPES):
|
||||
response = flask.Response(response)
|
||||
|
||||
if new_theme is None:
|
||||
pass
|
||||
elif new_theme == '':
|
||||
response.set_cookie('etiquette_theme', value='', expires=0)
|
||||
elif new_theme != old_theme:
|
||||
response.set_cookie('etiquette_theme', value=new_theme, expires=2147483647)
|
||||
|
||||
return response
|
||||
|
||||
def send_file(filepath, override_mimetype=None):
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
import flask; from flask import request
|
||||
import functools
|
||||
import time
|
||||
import werkzeug.datastructures
|
||||
|
||||
from voussoirkit import dotdict
|
||||
from voussoirkit import flasktools
|
||||
from voussoirkit import passwordy
|
||||
from voussoirkit import sentinel
|
||||
|
||||
|
@ -107,6 +109,28 @@ def catch_etiquette_exception(function):
|
|||
flask.abort(response)
|
||||
return wrapped
|
||||
|
||||
def give_theme_cookie(function):
|
||||
@functools.wraps(function)
|
||||
def wrapped(*args, **kwargs):
|
||||
old_theme = request.cookies.get('etiquette_theme', None)
|
||||
new_theme = request.args.get('theme', None)
|
||||
theme = new_theme or old_theme or 'slate'
|
||||
|
||||
request.cookies = werkzeug.datastructures.MultiDict(request.cookies)
|
||||
request.cookies['etiquette_theme'] = theme
|
||||
|
||||
response = function(*args, **kwargs)
|
||||
|
||||
if new_theme is None:
|
||||
pass
|
||||
elif new_theme == '':
|
||||
response.set_cookie('etiquette_theme', value='', expires=0)
|
||||
elif new_theme != old_theme:
|
||||
response.set_cookie('etiquette_theme', value=new_theme, expires=2147483647)
|
||||
|
||||
return response
|
||||
return wrapped
|
||||
|
||||
def required_fields(fields, forbid_whitespace=False):
|
||||
'''
|
||||
Declare that the endpoint requires certain POST body fields. Without them,
|
||||
|
|
Loading…
Reference in a new issue