Flask中的静态文件 - robot.txt,sitemap.xml(mod_wsgi)
有没有什么聪明的方法可以把静态文件存放在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
一定还有更方便的办法呢 :)
10 个回答
67
@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')
})
这个例子假设你的静态文件放在“static”文件夹里,你可以根据自己的环境调整这个路径。
72
这个问题的最简单答案可以参考这个回答,它和这个问题是一样的:
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:])
总结一下:
- 正如David提到的,配置得当的话,通过生产环境提供一些静态文件是可以的
- 访问/robots.txt时,不应该重定向到/static/robots.txt。(在Sean的回答中,这一点并不是很清楚。)
- 把静态文件放在应用根文件夹里并不是个好主意
- 最后,提出的解决方案比添加中间件的方法要干净得多:
82
最好的方法是把 static_url_path 设置为根网址
from flask import Flask
app = Flask(__name__, static_folder='static', static_url_path='')