bie*_*iad 91 python static mod-wsgi robots.txt flask
是否有任何聪明的解决方案可以在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
Run Code Online (Sandbox Code Playgroud)
必须有更方便的东西:)
dns*_*dns 74
最好的方法是将static_url_path设置为root url
from flask import Flask
app = Flask(__name__, static_folder='static', static_url_path='')
Run Code Online (Sandbox Code Playgroud)
Phi*_*ham 65
@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')
})
Run Code Online (Sandbox Code Playgroud)
此示例假定您的静态文件位于"静态"文件夹中,根据您的环境进行调整.
beb*_*bbi 57
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:])
Run Code Online (Sandbox Code Playgroud)
总结一下:
Sea*_*ing 21
即使这是一个陈旧的问题,我也在回答这个问题,因为这篇文章在谷歌搜索结果中显得相当高.虽然文档中没有介绍,但是如果您阅读了Flask Application对象构造函数的API文档,那么它就会被覆盖.通过传递命名参数,static_folder如下所示:
from flask import Flask
app = Flask(__name__,
static_folder="/path/to/static",
template_folder="/path/to/templates")
Run Code Online (Sandbox Code Playgroud)
...您可以定义提供静态文件的位置.同样,您可以定义一个template_folder,您的名字static_url_path.
von*_*hev 15
提供静态文件与旨在提供动态内容的应用程序无关.提供静态文件的正确方法取决于您使用的服务器.毕竟,当您启动并运行应用程序时,您需要将其绑定到Web服务器.我只能说apache httpd,所以提供静态文件的方式是在你通过mod-wsgi绑定到你的应用程序的虚拟主机中定义的.以下指南将向您展示如何投放站点地图,robots.txt或任何静态内容:http: //code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Mounting_At_Root_Of_Site
Ben*_*ing 14
发送静态文件的另一种方法是使用像这样的catch-all规则:
@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()
Run Code Online (Sandbox Code Playgroud)
我用它来尝试在开发时尽量减少设置.我从http://flask.pocoo.org/snippets/57/得到了这个想法
此外,我正在使用独立计算机上的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()
Run Code Online (Sandbox Code Playgroud)
自从提出这个问题以来,这可能已被添加,但我正在查看flask的"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.
'''
Run Code Online (Sandbox Code Playgroud)
...引用flask.send_file:
send_file(filename_or_fp, mimetype=None, as_attachment=False, attachment_filename=None, add_etags=True, cache_timeout=43200, conditional=False)
Run Code Online (Sandbox Code Playgroud)
...虽然send_from_directory直接将**选项传递给send_file,但对于更多控制似乎更好.
| 归档时间: |
|
| 查看次数: |
39919 次 |
| 最近记录: |