Flask:如何提供静态 html?

Posted

技术标签:

【中文标题】Flask:如何提供静态 html?【英文标题】:Flask: How to serve static html? 【发布时间】:2014-08-26 00:44:51 【问题描述】:

我正在尝试提供静态 html 文件,但返回 500 错误 (editor.html 的副本位于 .py 和模板目录中) 这就是我尝试过的全部:

from flask import Flask
app = Flask(__name__, static_url_path='/templates')
@app.route('/')
def hello_world():
    #return 'Hello World1!' #this works correctly!
    #return render_template('editor.html')
    #return render_template('/editor.html')
    #return render_template(url_for('templates', filename='editor.html'))
    #return app.send_static_file('editor.html') #404 error (Not Found)
    return send_from_directory('templates', 'editor.html')

这是回复:

Title: 500 Internal Server Srror

Internal Server Error

The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.

【问题讨论】:

其他地方有一个不同的错误。您的大多数尝试应该都成功了,但是如果即使只返回一个字符串也失败了,您需要查看控制台并查看抛出了什么错误,或者在调试模式下运行 Flask。 很抱歉我忘了删除它,但字符串可以正常工作。 你试过app = Flask(__name__)而不是指定路径吗? 是的,这是我的第一次尝试,两种方式都返回 404 错误 Not found 你是如何运行 WSGI 应用程序的? 【参考方案1】:

将其简化为可行的最简单方法:

    将静态资源放入您的static 子文件夹。 将 Flask 设置为默认值,也不要给它static_url_path。 通过预配置的/static/ 访问静态内容以验证文件是否有效

如果您仍然想重用静态文件,请使用current_app.send_static_file(),并且不要使用前导/ 斜杠:

from flask import Flask, current_app
app = Flask(__name__)

@app.route('/')
def hello_world():
    return current_app.send_static_file('editor.html')

这会在static 文件夹中直接 查找文件editor.html

这假定您将上述文件保存在具有 static 子文件夹的文件夹中,该子文件夹内有一个文件 editor.html

一些进一步的说明:

static_url_path 更改了 URL 静态文件可用的位置,而不是用于从中加载数据的文件系统上的位置。 render_template() 假设您的文件是 Jinja2 模板;如果它真的只是一个静态文件,那么如果该文件中有实际的可执行语法有错误或缺少上下文,那么这就是过度杀伤和可能导致错误。

【讨论】:

那么,如果这是一个实际的模板呢?我该怎么称呼它? @shuji: 然后你把它放在templates 子目录中并使用return render_template('editor.html')。确保导入 render_template 函数。 @MartijnPieters 我无法将我的 css、js 和图像添加到这个 html 文件中。我应该如何存储我的帮助文件以便它们被服务器拾取? @Amriteya:为什么不将文件设为合适的模板并从新路径提供它?这样,您就可以使用标准模板功能来包含 JS、CSS 或图像等静态资源。否则,请检查您的浏览器开发工具以查看它从何处加载这些资源,并根据需要进行调整。如果没有关于您的情况的详细信息,我只能提供一般性建议,而 cmets 不是解决此类问题的地方。 @MartijnPieters 它没有加载到我的浏览器中的资源选项卡下。事实是我有一个 HTML 和一个 js、css 和图像,每个都支持该 HTML。这么多模板化似乎毫无意义。【参考方案2】:

所有答案都很好,但对我来说效果很好的只是使用来自 Flask 的简单函数send_file。当 host:port/ApiName 将在浏览器中显示文件的输出

时,当您只需要发送一个 html 文件作为响应时,这很有效

@app.route('/ApiName')
def ApiFunc():
    try:
        #return send_file('relAdmin/login.html')
        return send_file('some-other-directory-than-root/your-file.extension')
    except Exception as e:
        logging.info(e.args[0])```

【讨论】:

【参考方案3】:

send_from_directorysend_file 需要从 flask 改成 import

如果您执行以下操作,您的代码示例将起作用:

from flask import Flask, send_from_directory
app = Flask(__name__, static_url_path='/templates')

@app.route('/')
def hello_world():
    return send_from_directory('templates', 'editor.html')

但是,请记住该文件是否会加载其他文件,例如javascript、css 等,您也必须为它们定义路由。

另外,据我了解,这不是生产中推荐的方法,因为它很慢。

【讨论】:

以上是关于Flask:如何提供静态 html?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Nginx 提供 Flask 静态文件?

Flask提供自包含的静态项目

Flask: 静态文件 +

网站后端_Python+Flask.0009.FLASK静态资源之默认及自定义资源目录?

Google App Engine 不提供静态文件

使用 url_for 链接到 Flask 静态文件