在 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 文件在<head>
中定义了<style>
,并从本地文件夹“模板”加载。
【讨论】:
以上是关于在 python 脚本中生成带有图像和文本的 html 文档(如果可能,不使用服务器)的主要内容,如果未能解决你的问题,请参考以下文章
在视图而不是模板中生成带有 Django 静态 url 的图像标签