Python Flask 中的静态文件——robot.txt、sitemap.xml (mod_wsgi)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4239825/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Static files in Flask - robot.txt, sitemap.xml (mod_wsgi)
提问by biesiad
Is there any clever solution to store static files in Flask's application root directory. robots.txt and sitemap.xml are expected to be found in /, so my idea was to create routes for them:
有没有什么聪明的解决方案可以在 Flask 的应用程序根目录中存储静态文件。robots.txt 和 sitemap.xml 应该在 / 中找到,所以我的想法是为它们创建路由:
@app.route('/sitemap.xml', methods=['GET'])
def sitemap():
response = make_response(open('sitemap.xml').read())
response.headers["Content-type"] = "text/plain"
return response
There must be something more convenient :)
一定有更方便的东西:)
采纳答案by dns
The best way is to set static_url_pathto root url
最好的方法是将static_url_path设置为 root url
from flask import Flask
app = Flask(__name__, static_folder='static', static_url_path='')
回答by vonPetrushev
Serving static files has nothing to do with application that is meant to deliver dynamic content. The correct way of serving static files is dependent of what server you're using. After all, when you get your app up and running, you will need to bind it to a web server. I can speak only for apache httpd, so the way of serving static files is defined in the virtual host that you are binding to your application through mod-wsgi. Here is the guide that will show you how to serve sitemaps, robots.txt or any static content: http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Mounting_At_Root_Of_Site
提供静态文件与旨在提供动态内容的应用程序无关。提供静态文件的正确方式取决于您使用的服务器。毕竟,当您启动并运行应用程序时,您需要将其绑定到 Web 服务器。我只能说 apache httpd,因此提供静态文件的方式是在您通过 mod-wsgi 绑定到应用程序的虚拟主机中定义的。以下指南将向您展示如何提供站点地图、robots.txt 或任何静态内容:http: //code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Mounting_At_Root_Of_Site
回答by Philip Southam
@vonPetrushev is right, in production you'll want to serve static files via nginx or apache, but for development it's nice to have your dev environment simple having your python app serving up the static content as well so you don't have to worry about changing configurations and multiple projects. To do that, you'll want to use the SharedDataMiddleware.
@vonPetrushev 是对的,在生产中你会希望通过 nginx 或 apache 提供静态文件,但是对于开发来说,让你的开发环境简单让你的 python 应用程序也提供静态内容是很好的,所以你不必担心关于更改配置和多个项目。为此,您需要使用SharedDataMiddleware。
from flask import Flask
app = Flask(__name__)
'''
Your app setup and code
'''
if app.config['DEBUG']:
from werkzeug import SharedDataMiddleware
import os
app.wsgi_app = SharedDataMiddleware(app.wsgi_app, {
'/': os.path.join(os.path.dirname(__file__), 'static')
})
This example assumes your static files are in the folder "static", adjust to whatever fits your environment.
此示例假设您的静态文件位于“static”文件夹中,请根据您的环境进行调整。
回答by Josh Klein
From the documentation here: http://flask.pocoo.org/docs/quickstart/#static-files
从这里的文档:http: //flask.pocoo.org/docs/quickstart/#static-files
Dynamic web applications need static files as well. That's usually where the CSS and JavaScript files are coming from. Ideally your web server is configured to serve them for you, but during development Flask can do that as well. Just create a folder called static in your package or next to your module and it will be available at /static on the application.
To generate URLs to that part of the URL, use the special 'static' URL name:
url_for('static', filename='style.css')
The file has to be stored on the filesystem as static/style.css.
动态 Web 应用程序也需要静态文件。这通常是 CSS 和 JavaScript 文件的来源。理想情况下,您的 Web 服务器被配置为为您服务,但在开发过程中 Flask 也可以这样做。只需在您的包中或模块旁边创建一个名为 static 的文件夹,它将在应用程序的 /static 中可用。
要生成该部分 URL 的 URL,请使用特殊的“静态”URL 名称:
url_for('static', filename='style.css')
该文件必须作为 static/style.css 存储在文件系统上。
回答by blast_hardcheese
This might have been added since this question was asked, but I was looking through flask's "helpers.py" and I found flask.send_from_directory:
自从提出这个问题以来,这可能已被添加,但我正在查看烧瓶的“helpers.py”,我发现了flask.send_from_directory:
send_from_directory(directory, filename, **options)
'''
send_from_directory(directory, filename, **options)
Send a file from a given directory with send_file. This
is a secure way to quickly expose static files from an upload folder
or something similar.
'''
... which references flask.send_file:
...引用flask.send_file:
send_file(filename_or_fp, mimetype=None, as_attachment=False, attachment_filename=None, add_etags=True, cache_timeout=43200, conditional=False)
... which seems better for more control, although send_from_directory passes **options directly through to send_file.
...这对于更多控制似乎更好,尽管 send_from_directory 将 **options 直接传递给 send_file。
回答by jpanganiban
I'm having the same dilemma as well. Did some search and found my answer(MHO):
我也有同样的困境。进行了一些搜索并找到了我的答案(MHO):
Might as well quote from the documentation
不妨从文档中引用
Dynamic web applications need static files as well. That's usually where the CSS and JavaScript files are coming from. Ideally your web server is configured to serve them for you, but during development Flask can do that as well. Just create a folder called static in your package or next to your module and it will be available at /static on the application.
动态 Web 应用程序也需要静态文件。这通常是 CSS 和 JavaScript 文件的来源。理想情况下,您的 Web 服务器被配置为为您服务,但在开发过程中 Flask 也可以这样做。只需在您的包中或模块旁边创建一个名为 static 的文件夹,它将在应用程序的 /static 中可用。
IMHO: When your application is up for production, static file serving should be (or is ideally) configured on the webserver (nginx, apache); but during development, Flask made it available to serve static files. This is to help you develop rapidly - no need to setup webservers and such.
恕我直言:当您的应用程序投入生产时,应该(或理想情况下)在网络服务器(nginx、apache)上配置静态文件服务;但在开发过程中,Flask 使其可用于提供静态文件。这是为了帮助您快速开发 - 无需设置网络服务器等。
Hope it helps.
希望能帮助到你。
回答by Ben Golding
Another way to send static files is to use a catch-all rule like this:
另一种发送静态文件的方法是使用像这样的包罗万象的规则:
@app.route('/<path:path>')
def catch_all(path):
if not app.debug:
flask.abort(404)
try:
f = open(path)
except IOError, e:
flask.abort(404)
return
return f.read()
I use this to try to minimise the set-up when developing. I got the idea from http://flask.pocoo.org/snippets/57/
我用它来尽量减少开发时的设置。我从http://flask.pocoo.org/snippets/57/得到了这个想法
Further, I'm developing using flask on my standalone machine but deploying with Apache in production server. I use:
此外,我正在我的独立机器上使用 Flask 进行开发,但在生产服务器中使用 Apache 进行部署。我用:
file_suffix_to_mimetype = {
'.css': 'text/css',
'.jpg': 'image/jpeg',
'.html': 'text/html',
'.ico': 'image/x-icon',
'.png': 'image/png',
'.js': 'application/javascript'
}
def static_file(path):
try:
f = open(path)
except IOError, e:
flask.abort(404)
return
root, ext = os.path.splitext(path)
if ext in file_suffix_to_mimetype:
return flask.Response(f.read(), mimetype=file_suffix_to_mimetype[ext])
return f.read()
[...]
if __name__ == '__main__':
parser = optparse.OptionParser()
parser.add_option('-d', '--debug', dest='debug', default=False,
help='turn on Flask debugging', action='store_true')
options, args = parser.parse_args()
if options.debug:
app.debug = True
# set up flask to serve static content
app.add_url_rule('/<path:path>', 'static_file', static_file)
app.run()
回答by Sean McSomething
Even though this is an old answered question, I'm answering this because this post comes up pretty high in the Google results. While it's not covered in the documentation, if you read the API docsfor the Flask Application object constructor it's covered. By passing the named parameter static_folderlike so:
尽管这是一个老问题,但我还是要回答这个问题,因为这篇文章在 Google 结果中的排名非常高。虽然文档中没有涵盖,但如果您阅读Flask 应用程序对象构造函数的 API 文档,它就会被涵盖。通过static_folder像这样传递命名参数:
from flask import Flask
app = Flask(__name__,
static_folder="/path/to/static",
template_folder="/path/to/templates")
...you can define where static files are served from. Similarly, you can define a template_folder, the name of you static_url_path.
...您可以定义从何处提供静态文件。同样,您可以定义 a template_folder,即您的名字static_url_path。
回答by bebbi
The cleanest answer to this question is the answerto this (identical) question:
from flask import Flask, request, send_from_directory
app = Flask(__name__, static_folder='static')
@app.route('/robots.txt')
@app.route('/sitemap.xml')
def static_from_root():
return send_from_directory(app.static_folder, request.path[1:])
To summarize:
总结一下:
- as David pointed out, with the right config it's ok to serve a few static files through prod
- looking for /robots.txt shouldn't result in a redirect to /static/robots.txt. (In Seans answer it's not immediately clear how that's achieved.)
- it's not clean to add static files into the app root folder
- finally, the proposed solution looks much cleaner than the adding middleware approach:
- 正如大卫指出的那样,通过正确的配置,可以通过 prod 提供一些静态文件
- 查找 /robots.txt 不应导致重定向到 /static/robots.txt。(在 Seans 的回答中,目前尚不清楚这是如何实现的。)
- 将静态文件添加到应用程序根文件夹中并不干净
- 最后,提议的解决方案看起来比添加中间件方法更简洁:

