chevron
chevron copied to clipboard
Support custom python object serialization
Due to security issues we decided to migrate from jinja to mustache and faced some problems with writing custom lambdas. Adding custom serialization of python objects would help a lot.
Toy example, on what is impossible to elegantly achieve now.
- Dictionary data
data = {"text": "text", "datetime": datetime(2000, 1, 1)}arrives; - We want to render both date (using custom lambda for example) and JSON representation of the whole dictionary, e.g.,
received on 2000-01-01T00:00:00: {"text": "text", "datetime": "2000-01-01T00:00:00" }; - Without custom serialization, we would need to pass both
dataitself asXand its JSON representation asYtorenderfunction as follows:render(data={'X': data, 'Y': json.dumps(data, ...)})and then use a templatereceived on {{ X.datetime }}: {{ Y }}. It is clumsy and requires special server-side pre-processing for every such case; - Instead, we would like to be able to serialize any data to JSON string and pass it to custom lambdas that will be able to process them accordingly.
Complete example of what we want to achieve:
import fast_json
from datetime import datetime
import chevron
def format_dt(text, render):
params = fast_json.loads(render(text))
dt = datetime.fromisoformat(params['dt'])
return dt.strftime(params['format'])
chevron.render(
'{{#format_dt}}{"dt": "{{ data.dt }}", "format": "%d-%m-%Y"}{{/format_dt}}: {{ data }}',
data={
'data': {
'dt': datetime.now(),
'text': 'text',
},
'format_dt': format_dt,
},
serializer=fast_json.dumps,
).replace('"', '"')
gives '03-11-2021: {"dt": "2021-11-03T16:05:29.477125", "text": "text"}'
instead of "03-11-2021: {'dt': datetime.datetime(2021, 11, 3, 16, 6, 42, 483261), 'text': 'text'}" without custom serialization.