Sanic, шаблон в асинхронном режиме и Jinja2

Я начинаю с python, поэтому могу ошибаться. Мне нравится фреймворк Sanic для Python, и мне нужен механизм шаблонов, и я бы предпочел использовать Jinja2.

Я нашел два расширения для Sanic: 1. https://github.com/yunstanford/jinja2-sanic 2. https://github.com/lixxu/sanic-jinja2

В документации Jinja2 я увидел, что Jinja может работать асинхронно с определенной опцией «enable_async=True» для объекта Environnement, а затем с использованием «render_async()». Итак, Jinja можно использовать изначально в асинхронном режиме.

Первый вопрос: зачем использовать расширения? Синтаксис Jinja прост.

Второй вопрос: я проверил код расширений и не нашел ссылки на специальный асинхронный синтаксис в Jinja. Я не уверен, но я считаю, что расширения используют Jinga в режиме синхронизации. Если правда, то почему?

Третий вопрос: проверил код Jinja2, вроде файлы шаблонов читаются нормально, а не асинхронным методом (типа aiofiles). Так вот, я не понимаю, где тут асинхронный режим...

Спасибо за вашу помощь


person Patic    schedule 04.09.2017    source источник
comment
Привет, у меня нет точного ответа на вашу проблему, но возможно и довольно легко запустить код Python с блокировкой ввода-вывода из асинхронного блокирующего сопрограммы. pymotw.com/3/asyncio/executors.html   -  person glenfant    schedule 06.09.2017
comment
Спасибо большое за вашу помощь. Однако мне это не нужно для использования Jinja2. API хорошо работает с Sanic, я уже проверял. Я также думаю, что расширения работают правильно. Я пытаюсь понять, как асинхронный режим работает с механизмом шаблонов, и я ищу лучшие практики и возможные оптимизации.   -  person Patic    schedule 06.09.2017


Ответы (1)


Поддержка асинхронности Начиная с версии 2.9, Jinja2 также поддерживает конструкции Python async и await. Что касается дизайнеров шаблонов, эта функция совершенно непрозрачна для них, однако как разработчик вы должны знать, как она реализована, поскольку она влияет на то, какой тип API вы можете безопасно предоставлять в среде шаблона.

Как и другие, вы можете обернуть код блокировки в синтаксис асинхронного ожидания. из jinja2 импорт шаблона impoty asyncio

async def generate_jinja_template():
    t = Template("Hello {{ something }}!") 
    t.render(something="World")
    return t

event_loop = asyncio.get_event_loop()
try:
    event_loop.run_until_complete(
        generate_jinja_template()
    )
finally:
    event_loop.close()
person Christo Goosen    schedule 24.07.2018