Flask中的静态文件 - robot.txt,sitemap.xml(mod_wsgi)

101 投票
10 回答
53248 浏览
提问于 2025-04-16 07:25

有没有什么聪明的方法可以把静态文件存放在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='')

撰写回答