在 python 脚本中生成带有图像和文本的 html 文档(如果可能,不使用服务器)

Posted

技术标签:

【中文标题】在 python 脚本中生成带有图像和文本的 html 文档(如果可能,不使用服务器)【英文标题】:Generate html document with images and text within python script (without servers if possible) 【发布时间】:2017-02-15 03:19:15 【问题描述】:

如何在 python 中使用模板和 css 生成包含图像和文本的 html

在 *** 上几乎没有类似的问题(例如:Q1、Q2、Q3),但它们提供的解决方案(在我看来)似乎有些矫枉过正,比如需要服务器(例如 genshi)。

使用django 的简单代码如下:

from django.template import Template, Context
from django.conf import settings
settings.configure() # We have to do this to use django templates standalone - see
# https://***.com/questions/98135/how-do-i-use-django-templates-without-the-rest-of-django

# Our template. Could just as easily be stored in a separate file
template = """
<html>
<head>
<title>Template  title </title>
</head>
<body>
Body with  mystring .
</body>
</html>
"""

t = Template(template)
c = Context("title": "title from code",
             "mystring":"string from code")
print t.render(c)

(来自这里:Generating HTML documents in python)

此代码产生错误,据说是因为我需要设置一个后端:

Traceback (most recent call last):
  File "<input>", line 17, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/template/base.py", line 184, in __init__
    engine = Engine.get_default()
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/template/engine.py", line 81, in get_default
    "No DjangoTemplates backend is configured.")
django.core.exceptions.ImproperlyConfigured: No DjangoTemplates backend is configured.

有没有一种简单的方法来拥有一个 template.html 和 style.css 以及一堆图像,并使用 python 脚本中的数据来替换 template.html 中的占位符,而无需设置服务器?

【问题讨论】:

错误只是告诉您需要将一些模板设置传递给settings.configure()。但是为什么不使用像Jinja2 这样的独立模板系统呢? 仅供参考:genshi “需要服务器”。 @brunodesthuilliers,您能否解释一下为什么 genshi 不需要服务器?我可能对这方面有点困惑,你也可以帮助我澄清我的问题。从本教程 (genshi.edgewall.org/wiki/GenshiTutorial) 看来,通过调用 "$ PYTHONPATH=.python geddit/controller.py geddit.db" 会启动服务器以在浏览器上显示结果。谢谢。 @DanielRoseman - 我不确定我应该传递哪些模板设置? settings.configure(DEBUG=True) 产生相同的错误。将研究 Jinja2,但这不应该已经可以使用 django 了吗? docs.djangoproject.com/en/1.10/ref/settings/… 【参考方案1】:

有很多 python 模板引擎 - 首先你可能想看看这里:https://wiki.python.org/moin/Templating

就我而言,我会使用 jinja2 但 YMMV。

【讨论】:

【参考方案2】:

我使用这样的代码:

self.content = '''
    <html>
        <head>
            ''' + base_pyhtml.getAdmin ('documentation') + '''
            <style>
                ''' + base_pycss.getAll () + '''
                ''' + documentation_pycss.getAll () + '''
            </style>
        </head>
        <body>
            ''' + base_pyhtml.getFixed () + '''

            <div class="moving">
                <div class="documentation">

def getAll ():
    return '''
        * 
            margin: 0;
            padding: 0;
        

        body 
            font-family: arial;
        

        html 
            visibility: hidden;
        

        h1 
            margin-bottom: 30;
            padding: 10 1 10 1;
            text-align: center;
            color: ''' + logoGreen + ''';
            background-color: ''' + panoramaPink + ''';
            font-size: 110%;

对我来说,它在实践中运行良好。这个site 完全是用这种微不足道的技术制作的。我喜欢的是,我可以通过这种方式充分利用 Python 的强大功能,而不是被特殊的模板语法限制甚至学习。

通过使用 .pyhtml 和 .pycss 扩展名并配置我的编辑器,我可以在此类代码上突出显示 HTML 和 CSS 语法,如下所示:

【讨论】:

【参考方案3】:

感谢您的回答,他们帮助我想出了适合我的东西。

在下面的脚本中,我使用jinja2 来呈现一个 html 文件('index.html')。

from jinja2 import Template, Environment, FileSystemLoader

# Render html file
env = Environment(loader=FileSystemLoader('templates'))
template = env.get_template('index.html')
output_from_parsed_template = template.render(no_users=len(users), do_stages=do_stages, users=users,                                                 message_counts=message_counts)

# to save the results
with open("OutputAnalysis.html", "w") as fh:
    fh.write(output_from_parsed_template) 

html模板是:

<!DOCTYPE html>
<html lang="en">
<head>
    <!-- <link rel="stylesheet" type="text/css" href="styles.css"> -->
    <style type="text/css">
    #share-buttons img 
        width: 32px;
        padding: 5px;
        border: 0;
        box-shadow: 0;
        display: inline;
        
    body    
        padding-left: 5px;
        padding-right: 5px;
        color: black;
        max-width: 450px;
        text-align: center; 
    

    </style>
    <title>Your file 2016</title>
</head>
<body>
    <h1>This has  no_users  users:</h1>
    <ul id="users">
    % for user in users %
        <li>user</li>
    % endfor %
    </ul>

    # STAGE 1 #
    % if 1 in do_stages%
    <h1>Something worth showing</h1>
    <p> 
        <img src="image.png"  style="width:200px;height:200px;"> 
    </p>
    % endif %

    # STAGE 2 #
    % if 2 in do_stages%
    <h1>Other header</h1>
    <p> 
        % for u in range(0,no_users) %
        <p>users[u] sent message_counts[u] messages.</p>
        % endfor %
    </p>
    <p> 
    % endif %


    <div id="share-buttons">
        <!-- Twitter -->
    <a href="https://twitter.com/share?url=https://stefanocosentino.com" target="_blank">
        <img src="twitter_icon.png"  />
    </a>

</body>
</html>

html 文件在&lt;head&gt; 中定义了&lt;style&gt;,并从本地文件夹“模板”加载。

【讨论】:

以上是关于在 python 脚本中生成带有图像和文本的 html 文档(如果可能,不使用服务器)的主要内容,如果未能解决你的问题,请参考以下文章

在视图而不是模板中生成带有 Django 静态 url 的图像标签

如何不在 Python、Django 中生成两次相同的动态图像?

FPDF 在 Python 中生成空白页面

在 PHP 中生成带有动态图像的 ODT 文档

循环,从数组中生成带有函数的按钮

r 在R中生成带有马尔可夫链的文本