замените некоторый html-контент значениями

#python #html #formatting

#python #HTML #форматирование

Вопрос:

Я хочу отправить электронное письмо с подтверждением. Электронное письмо состоит из HTML. Я сохранил HTML-код в файл с именем email_templates/verify.html (path). Проблема в том, что в HTML-файле есть некоторые константы, неизвестные до времени выполнения. Например, в электронном письме я ссылаюсь на имя пользователя, на которое я отправляю свое электронное письмо, но поскольку каждое электронное письмо ссылается на кого-то другого, я не могу включить имя в шаблон. Одно из решений, которое приходит на ум, — использовать некоторую технику форматирования в строках

 <div>
hello {usrname}!
<div>
  

а затем в коде python сделайте что-то вроде:

 lines = open('email_templates/verify.html', 'r').read()
lines.format('joe')
  

Но этот код, хотя на самом деле и может работать, имеет некоторые проблемы:

  1. каждое {} в HTML-файле может быть ошибкой при форматировании
  2. код в текущей форме не очень удобочитаем
  3. код не является элегантным
  4. для читателя HTML, который не знает python, заполнители форматирования будут сбивать с толку

Есть ли лучший способ подойти к этому?

Комментарии:

1. Смотрите Шаблоны

2. @PeterWood не могли бы вы привести пример использования, пожалуйста?

3. По ссылке есть примеры, и во всей документации по связанным библиотекам также есть примеры. Чего-то не хватало?

4. @PeterWood да. большинство из них ведут к 404-м годам. Чего я здесь не понимаю, так это где я должен использовать этот html? В виде строки? В файле? Как мне активировать формат? происходит ли это автоматически? Нужно ли мне для этого вызывать функцию? Документы неясны, по крайней мере для меня

5. Две ссылки представляют собой стандартную строку документации Python . Шаблон , а Jinja — сторонняя библиотека.

Ответ №1:

Это может и должно быть сделано с помощью шаблонов. Как вы упомянули, возможно, заполнители python будут сбивать с толку, но я говорю вам, что они не сбивают с толку, движки шаблонов следят за тем, чтобы HTML выглядел как HTML, а эти теги шаблонов выглядели как теги шаблонов. Движки шаблонов устанавливают правила, какие заполнители вы можете использовать, а какие нет. Кроме того, они намного быстрее, чем предложенный вами метод открытия файла, потому что они оптимизированы для этого.

Давайте разберемся на примере:

Существует несколько движков для создания шаблонов. Jinja2 — один из лучших.

Сначала установите Jinja2.

 pip install jinja2
  

Во-вторых, создайте файл python (назовите его как угодно) и папку с именем «шаблоны». В папке «Шаблоны» создайте свой verify.html

Ваша структура папок должна выглядеть следующим образом:

 folder1
  |
  |--> pythonfile.py
  |--> templates
           |
           |--> verify.html
  

В-третьих, поместите некоторый пример кода в HTML-файл. Я поместил этот пример в свой verify.html:

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Index</title>
</head>
<body>
    <h1>Dear {{ user }}!</h1>
    <h4>
        Hope you are fine.
    </h4>
    <p>
        Thank you for signing up. Here is your {{ coupon_code }}
    </p>
</body>
</html>
  

Теперь в этом html-файле вы видите, что у меня есть обычные html-теги. Но есть два набора фигурных скобок, встречающихся дважды. Слово, написанное внутри фигурных скобок, будет рассматриваться jinja как переменная. Значение этой переменной будет передано нашим файлом python в этот html-файл.
Кроме того, чтобы быть последовательным, jinja не позволяет вам просто использовать какие-либо фигурные скобки. Я имею в виду, если бы я поставил «<>» вместо «{{ }}», это бы не сработало. Итак, необходимо соблюдать некоторые правила.
Подробнее читайте здесь: Разрешенные теги и фильтры Jinja

В-четвертых, скопируйте этот код в созданный нами файл python.

 #Imports
from jinja2 import Environment, FileSystemLoader, Template

#name of the folder where index file is located.
file_loader = FileSystemLoader('templates')

#This object is needed to create a template object.
env = Environment(loader=file_loader)

#path of the HTML file reletive to the folder.
template = env.get_template('./index.html')

#Data dictionary to be supplied to our HTML file.
input_dict = {
    'user': 'Harry',
    'coupon_code': '12313ASDSA4'}

#This function renders the data substituted HTML form.
output = template.render(input_dict)
print(output)
  

Теперь запустите этот файл python.