Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Heroku 如何指向AmazonS3URL?_Heroku_Flask_Static Files - Fatal编程技术网

Heroku 如何指向AmazonS3URL?

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

我有一个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 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上传功能对您来说非常方便!:-)