如何将 Flask 静态指向 Amazon S3 URL?

2023-12-29

我有一个在 Heroku 上托管的 Flask 应用程序,但希望从 Amazon S3 提供静态文件。

在我的模板中,我使用 url_for() 来引用静态文件。在 Flask 应用程序的初始化中,我想把

app = Flask(__name__, static_url_path="http://my-bucket.s3.amazonaws.com")

确保不是 mysite.com/static/,http://my-bucket.s3.amazonaws.com/static/ http://my-bucket.s3.amazonaws.com/static/用来。但是我收到这个错误:

ValueError: urls must start with a leading slash

如果我将其更改为带有前导斜杠的值,它就可以工作,但我希望静态 URL 指向 S3(一个外部域),因此它需要以 http:// 开头。

我究竟做错了什么?如何通过 Flask 和 Heroku 将 S3 用于静态文件?


如果您正在使用任何static_*的选项Flask对象,假设它将负责提供这些文件。 Astatic路由配置为既作为提供静态文件的视图,又作为url_for()生成 URL 的目标。

因此,仅使用 Flask,您就必须替换所有url_for('static', ...)改为使用硬编码 URL 调用您的 CDN。

相反,您应该改用Flask-CDN https://flask-cdn.readthedocs.org/en/latest/,一个方便的 Flask 插件,用于处理 Flask 托管的静态文件和 CDN 托管的静态文件之间的无缝切换:

from flask_cdn import CDN

app = Flask(__name__)
cdn = CDN(app)

并设置CDN_DOMAIN配置选项http://my-bucket.s3.amazonaws.com部署到生产时。

在调试模式下,url_for()然后会生成旧的/static/..Flask 在生产模式下要处理的 url,url_for()在这些 url 前面加上前缀CDN_DOMAIN价值。如果后者保留默认值None设置,不会发生此类 URL 更改,从而可以在本地运行 Flaskdebug根据需要关闭。

请注意,url_for()仅被改变对于 Jinja 模板;如果您需要在视图中生成静态 URL,则必须交换flask.url_for()出去为了flask_cdn.url_for() https://flask-cdn.readthedocs.org/en/latest/#flask_cdn.url_for.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Flask 静态指向 Amazon S3 URL? 的相关文章

随机推荐

  • 是否可以安排在特定日期和时间发布?

    我正在使用 Azure DevOps 发布管道来自动化部署 我想安排发布创建在特定的日期和时间进行 但根据下面的屏幕截图 只能选择一周中的几天 并且您不能将触发器指定为仅一次 这是一个问题 因为触发器将导致每周在指定的日期进行发布 并且我们
  • @synchronized vs. NSLock 实例 vs. pthread_mutex_t

    我正在观看一个关于多线程的 2 年前的 教程视频 其中指出 NSLock实例比使用快 3 倍 同步 pthread mutex t比 2 倍快NSLock实例 实际上比 同步 这是真的 我还没有找到任何权威的说法 但我只是想在 StackO
  • 将石墨指标偏移当前时间范围内的最低值

    我有带有 Graphite 指标的 Grafana 我有一个图表显示EnqueueCountActiveMQ 中的某些特定队列 问题是EnqueueCount显示自创建队列以来的所有值 因此当我将 Grafana 中的时间范围缩小到 今天到
  • 向 ggplot 图形添加文件名或其他注释

    我使用 ggplot 来制作大部分图形 这些可以是单面板 也可以是多面的 为了更容易跟踪修订 我想在绘图的角落生成一个包含一些文本的小标签 在伪代码中 我正在寻找这样的东西 generate the initial plot p lt gg
  • WPF/MVVM 在运行时加载用户控件

    我知道有很多关于我的问题的文章 但我找不到解决方案 我是 WPF MVVM 的新手 我尝试了解 MVVM 逻辑 所以我做了一个小项目来理解这一点 对于我以后的应用程序 我想将用户控件动态加载到我的窗口中 在我的 StartView 中 我有
  • UI 的可排序列表的动画过渡

    我正在与一个jQueryUI可排序列表 并且想要在以下情况下为过渡设置动画li当我向上或向下拖动元素时 s 会四处移动 作为Apple已经在他们的iPod app重新排列播放列表的歌曲时 这可能吗 我已经搜索了几个小时 但找不到任何有用的东
  • 立即启用保存文档 NSManagedObjectContext 吗?

    从 10 7 上带有 CoreData 模板的标准 Xcode 基于文档的应用程序开始 我遇到了一些令人沮丧的行为 我确信这是我忽略的简单事情 假设在我的 NSPersistentDocument 子类中 我有这样的东西 连接到窗口中的一个
  • Vim:选择文件后保持位置列表窗口打开

    我需要完全相反的行为这个问题 https stackoverflow com questions 10846598 close location list when selecting file 我的观察是 按下enter在位置列表窗口中的
  • 如何将一列拆分为按日期排序的多列

    当我尝试以正确的格式获取数据库数据时遇到很多问题 我正在寻找按天按列打印数据库输出的方法 我的数据库有两列 一列带有timestamp格式如下YYYY MM DD H M另一列包含与速度相关的数据 我需要按天将速度数据拆分为列 或多或少 我
  • 具有多维(或非标量)输出的 Scipy 过滤器

    有没有类似的过滤器ndimage s 通用过滤器 http docs scipy org doc scipy reference generated scipy ndimage filters generic filter html支持矢量
  • 我需要对标题属性(工具提示)进行 html 编码吗?

    在我的标记中我使用HTML title attributes我设置的Tooltip各种 ASP NET 控件的属性 例如asp Label 这些标题的内容来自数据库 我使用数据绑定语法 例如
  • Spring 4 Web 套接字 - 我必须有一个 stomp 代理吗?

    我一直在使用以下链接来使用新的 spring 4 websockets http spring io guides gs messaging stomp websocket http spring io guides gs messagin
  • 我的水晶报表在传递参数时没有刷新?

    我已经使用 Crystal Reports 本身中的 SQL 查询创建了 Crystal Reports 通过传递两个参数 即 例如 月和年 当我预览报告时 我可以通过传递不同的参数来浏览所有页面并且其工作正常 但是在通过浏览器查看报告时
  • ng-view 未显示解析

    我以这种方式使用解析 似乎是这样做的标准方法 但视图没有显示 我错过了什么想法吗 此致 angular module fifaApp ngRoute config function routeProvider routeProvider w
  • 如何显示图像的完整尺寸?

    我是新来的 也是 Android 编程新手 我在互联网上的一个网站上找到了这个示例 下面是示例 这是一个很棒的教程 我想要实现的是 当我单击 GridView 上的图片时 我想显示图像的完整大小 public class MainActiv
  • 如何使用 R RDCOMClient 检索 Outlook 收件箱电子邮件?

    library RDCOMClient create outlook object OutApp lt COMCreate Outlook Application 我想从名为 AUX 的 Outlook 文件夹中检索今天的电子邮件 解析电子
  • 在 XML 中使用包名称

    我正在使用 Android Studio 来构建我的应用程序 我想用gradle构建类型 我使用 applicationIdSuffix 在包名称中添加后缀 以修改测试构建类型的包名称 buildTypes debug runProguar
  • 服务工作人员错误:事件已响应

    我不断收到此错误 未捕获 承诺中 DOMException 无法在 FetchEvent 上执行 respondWith 该事件已被响应 我知道如果 fetch 函数中发生异步操作 服务工作人员会自动响应 但我无法完全弄清楚这段代码中的哪一
  • 第一次失败时停止 Fluent Validation

    我正在为我的请求对象定义验证 我希望验证器在第一次失败时停止 而不仅仅是同一条链上的失败 在下面的例子中 如果我的TechnicalHeader对象为空 当验证达到规则时 我收到 NullReference 异常TechnicalHeade
  • 如何将 Flask 静态指向 Amazon S3 URL?

    我有一个在 Heroku 上托管的 Flask 应用程序 但希望从 Amazon S3 提供静态文件 在我的模板中 我使用 url for 来引用静态文件 在 Flask 应用程序的初始化中 我想把 app Flask name stati