Heroku 如何指向AmazonS3URL?
我有一个Flask应用程序托管在Heroku上,但希望静态文件由AmazonS3提供 在我的模板中,我对静态文件的所有引用都使用url_for()。在Flask应用程序的初始化中,我想Heroku 如何指向AmazonS3URL?,heroku,flask,static-files,Heroku,Flask,Static Files,我有一个Flask应用程序托管在Heroku上,但希望静态文件由AmazonS3提供 在我的模板中,我对静态文件的所有引用都使用url_for()。在Flask应用程序的初始化中,我想 app = Flask(__name__, static_url_path="http://my-bucket.s3.amazonaws.com") 确保使用的是而不是mysite.com/static/。但是我得到了这个错误: ValueError: urls must start with a leadin
app = Flask(__name__, static_url_path="http://my-bucket.s3.amazonaws.com")
确保使用的是而不是mysite.com/static/。但是我得到了这个错误:
ValueError: urls must start with a leading slash
如果我将其更改为带前导斜杠的值,它就可以工作,但我希望静态URL指向S3,这是一个外部域,因此它需要以http://开头
我做错了什么?如何将S3用于Flask和Heroku的静态文件?如果您对
Flask
对象使用任何static.*
选项,则假定它将负责提供这些文件。配置了一个static
路由,该路由既是为静态文件提供服务的视图,也是为()生成url的url\u目标
因此,仅使用Flask,您就必须将('static',…)
调用的所有url\u替换为指向CDN的硬编码url
相反,您应该切换到使用一个方便的Flask附加组件来处理Flask和CDN托管的静态文件之间的无缝切换:
from flask_cdn import CDN
app = Flask(__name__)
cdn = CDN(app)
并将CDN\u域
configuration选项设置为http://my-bucket.s3.amazonaws.com
部署到生产时
在调试模式下,url\u for()
将生成旧的/static/。
url供Flask处理,在生产模式下,url\u for()
将这些url加上CDN\u域
值作为前缀。如果将后者保留为默认的None
设置,则不会发生此类URL更改,从而可以在需要时关闭debug
的情况下在本地运行Flask
请注意,url\u for()
的行为仅对Jinja模板进行了更改;如果需要在视图中生成静态url,则必须将flask.url\u替换为()
out for。太棒了,这个答案奏效了。谢谢你的详细解释。不过,我最终还是使用了Flasks3包(),因为它还可以通过一些python代码将文件上传到AmazonS3本身。再次感谢@当然可以;Flask-S3使用与Flask CDN完全相同的模式:为模板替换url\u for()
,以生成CDN url。但是我可以想象,额外的S3上传功能对您来说非常方便!:-)