Python 烧瓶中的速度优化
我的项目(Python2.7)由一个屏幕刮板组成,它每天收集一次数据,提取有用的内容并将其存储在几个pickle中。使用Flask/Ninja将pickle呈现为HTML页面。所有这些都可以,但是在我的本地主机(Windows10)上运行时,速度相当慢。我计划把它部署在Pythonywhere上 该网站也有一个关于页面。about页面的内容是一个标记文件,我在每次编辑后使用Python 烧瓶中的速度优化,python,html,flask,jinja2,Python,Html,Flask,Jinja2,我的项目(Python2.7)由一个屏幕刮板组成,它每天收集一次数据,提取有用的内容并将其存储在几个pickle中。使用Flask/Ninja将pickle呈现为HTML页面。所有这些都可以,但是在我的本地主机(Windows10)上运行时,速度相当慢。我计划把它部署在Pythonywhere上 该网站也有一个关于页面。about页面的内容是一个标记文件,我在每次编辑后使用markdown2将其转换为HTML。about模板加载HTML,如下所示: {% include 'about_conte
markdown2
将其转换为HTML。about模板加载HTML,如下所示:
{% include 'about_content.html' %}
这比让Flask Markdown
呈现about文本要快得多(正如我最初所做的那样):
那么现在。我有点担心当我部署站点时主页加载速度不够快。内容每天只更新一次,如果刷新主页,则无需重新呈现任何内容。所以我想知道我是否可以像对待about内容一样做一个类似的把戏:
我可以让Flask在呈现pickle之后,将结果保存为html,然后从部署的站点提供该结果吗?或者我可以调用某个浏览器模块,保存其输出,并为其提供服务吗?或者这是一个坏主意,我不应该担心,因为Flask在现实生活中的服务器上运行得非常快吗 关于渲染的问题
你可以用Jinja做很多事。可以随时运行Jinja并将其保存为HTML文件。这样,每次发送文件请求时,它都不必再次渲染。它只提供静态文件
下面是一些代码。我有一个观点,在它的一生中不会改变。因此,在创建视图后,我创建了一个静态HTML文件
from jinja2 import Environment, FileSystemLoader
def example_function():
'''Jinja templates are used to write to a new file instead of rendering when a request is received. Run this function whenever you need to create a static file'''
# I tell Jinja to use the templates directory
env = Environment(loader=FileSystemLoader('templates'))
# Look for the results template
template = env.get_template('results.html')
# You just render it once. Pass in whatever values you need.
# I'll only be changing the title in this small example.
output_from_parsed_template = template.render(title="Results")
with open("/directory/where/you/want/to/save/index.html", 'w') as f:
f.write(output_from_parsed_template)
# Flask route
@app.route('/directory/where/you/want/to/save/<path:path>')
def serve_static_file(path):
return send_from_directory("directory/where/you/want/to/save/", path)
其他方式
如果你想获得更好的性能,可以考虑通过GuniCon,NGIX和类似的软件来服务你的烧瓶应用程序。
Flask还有一个选项,您可以在其中启用多线程app.run(threaded=True)
2018年11月11日更新
-
你可以考虑使用ReISIS商店。每次发生使旧模板无效的情况时,请清除特定文件的缓存。在再次生成模板之前,首先查看Redis存储(模板呈现很可能需要您从数据库中读取数据。内存缓存存储速度更快,因此您将从Redis缓存中获益)
- 存储渲染文件并使用CDN提供服务。因此,每次客户机请求该特定模板时,该模板都已存储在CDN上,并且根本不会接触您的Flask服务器。您可以编写这样的逻辑:如果CDN上不存在文件或内容,它应该回退到Flask服务器。您只需要确保一个策略,这样CDN上就不会有过时的数据
应用程序时遇到了一些麻烦。我想我需要仔细阅读装饰器和
技巧。@RolfBly请注意,您必须使用send\u from\u目录发送文件。不要使用渲染模板。为什么要浪费时间(它会打开文件并搜索Jinja标记,然后发送),而我们已经知道它已经呈现了。对不起,打错了。我修正了我的答案:)
@app.route('/')
def index():
return render_template('index.html')
app.run(threaded=True)