Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support custom python object serialization #108

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

tzoiker
Copy link

@tzoiker tzoiker commented Nov 3, 2021

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 data itself as X and its JSON representation as Y to render function as follows: render(data={'X': data, 'Y': json.dumps(data, ...)}) and then use a template received 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant