Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 烧瓶中的速度优化_Python_Html_Flask_Jinja2 - Fatal编程技术网

Python 烧瓶中的速度优化

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

我的项目(Python2.7)由一个屏幕刮板组成,它每天收集一次数据,提取有用的内容并将其存储在几个pickle中。使用Flask/Ninja将pickle呈现为HTML页面。所有这些都可以,但是在我的本地主机(Windows10)上运行时,速度相当慢。我计划把它部署在Pythonywhere上

该网站也有一个关于页面。about页面的内容是一个标记文件,我在每次编辑后使用
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上就不会有过时的数据

顺便说一句,我忘了提一下。切勿在实际服务器(生产)上使用烧瓶。烧瓶的创造者本人反对这个想法。烧瓶既不安全,在现实生活中也不高效。如果您想在生产环境中部署Flask,请使用gunicorn和nginx。Pythonywhere开发人员(正如OP所说,他们计划在我们的网站上部署)的一个简短说明——我们使用nginx作为前端web服务器,因此您的Flask应用程序是安全高效的。@RolfBly这应该会减少您的工作量。使用gunicorn只需要3到4行附加代码。您还应该知道gunicorn在windows上不工作(它只在unix上工作)。在PythonAnywhere上部署时,您可以直接使用它。@AbhirathMahipal非常感谢!我让它按预期工作(参见编辑)。我确实在使用你的
应用程序时遇到了一些麻烦。我想我需要仔细阅读装饰器和
技巧。@RolfBly请注意,您必须使用send\u from\u目录发送文件。不要使用渲染模板。为什么要浪费时间(它会打开文件并搜索Jinja标记,然后发送),而我们已经知道它已经呈现了。对不起,打错了。我修正了我的答案:)
@app.route('/')
def index():
    return render_template('index.html')
app.run(threaded=True)