【发布时间】:2015-11-03 21:42:07
【问题描述】:
所以这很尴尬。我在Flask 中有一个应用程序,现在它只是提供一个带有一些指向 CSS 和 JS 的链接的静态 HTML 页面。而且我在文档Flask 中找不到描述返回静态文件的位置。是的,我可以使用render_template,但我知道数据没有模板化。我原以为send_file 或url_for 是正确的,但我无法让它们发挥作用。与此同时,我正在打开文件、阅读内容并使用适当的 mimetype 装配Response:
import os.path
from flask import Flask, Response
app = Flask(__name__)
app.config.from_object(__name__)
def root_dir(): # pragma: no cover
return os.path.abspath(os.path.dirname(__file__))
def get_file(filename): # pragma: no cover
try:
src = os.path.join(root_dir(), filename)
# Figure out how flask returns static files
# Tried:
# - render_template
# - send_file
# This should not be so non-obvious
return open(src).read()
except IOError as exc:
return str(exc)
@app.route('/', methods=['GET'])
def metrics(): # pragma: no cover
content = get_file('jenkins_analytics.html')
return Response(content, mimetype="text/html")
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def get_resource(path): # pragma: no cover
mimetypes = {
".css": "text/css",
".html": "text/html",
".js": "application/javascript",
}
complete_path = os.path.join(root_dir(), path)
ext = os.path.splitext(path)[1]
mimetype = mimetypes.get(ext, "text/html")
content = get_file(complete_path)
return Response(content, mimetype=mimetype)
if __name__ == '__main__': # pragma: no cover
app.run(port=80)
有人想为此提供代码示例或网址吗?我知道这将非常简单。
【问题讨论】:
-
为什么不使用 nginx 或其他 web 服务器来提供静态文件。
-
请记住,您实际“提供”文件的方式在生产(在您的 Web 服务器上)和开发(在您的本地计算机或其他一些测试区域)之间可能会有所不同。正如一些答案所指出的那样,您可能不想使用烧瓶提供静态文件,而是将它们放在自己的目录中,然后让您的实际 Web 服务器(Apache、nginx 等)直接为这些文件提供服务。跨度>
-
"为什么不使用 nginx ..." 因为当我在笔记本电脑上以开发人员模式运行它时,只需要运行一件事就很好,而且只运行一件事。是的,它让事情有点不同,但没关系。
-
即使在生产中,也很常见,当然前面有缓存层(例如 Varnish 或 Nginx 或 CDN)。
标签: python flask static-files