用值替换一些html内容

时间:2020-08-22 18:40:35

标签: python html formatting

我要发送验证电子邮件。该电子邮件包含HTML。我将HTML保存到名为email_templates/verify.html(路径)的文件中。问题在于,HTML文件中的某些常量直到运行时才是未知的。例如,在电子邮件中,我指的是向其发送电子邮件的用户名,但是由于每封电子邮件都指的是其他人,因此我无法在模板中包括该名称。我想到的一种解决方案是在

行中使用某种格式化技术
<div>
hello {usrname}!
<div>

,然后在python代码中执行以下操作:

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

但是,尽管该代码实际上可以工作,但存在一些问题:

  1. HTML文件中的每个{}都可能是错误的格式
  2. 当前形式的代码不太可读
  3. 代码不优雅
  4. 对于不了解python的HTML阅读器,格式占位符会造成混淆

有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:2)

这可以而且应该通过模板来完成。 正如您提到的那样,也许python占位符会令人困惑,但我告诉您它们并不令人困惑,模板引擎确保HTML看起来像HTML,而这些模板标签看起来像模板标签。模板引擎确定了可以使用和不能使用的占位符的规则。而且它们比您建议的文件打开方法快得多。因为它们被优化为这样做。

让我们以身作则:

那里有几个模板引擎。 Jinja2是最好的之一。

首先,安装Jinja2。

pip install jinja2

第二,创建一个python文件(命名为任意名称)和一个名为“ templates”的文件夹。在“模板”文件夹下,创建您的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标签。但是有两组花括号出现两次。大括号内写在花括号内的单词将被视为变量。此变量的值将由我们的python文件提供给此html文件。 另外,为保持一致,jinja不允许您仅使用任何花括号。我的意思是,如果我用“ <>”代替“ {{}}”,那是行不通的。因此,需要遵循一些规则。 在此处阅读更多信息:Jinja allowed tags and filters

第四,将此代码复制到我们创建的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文件。