3

我的应用程序包含一个大的图像文件夹结构。在生产中,图像由 CDN 提供。在开发中,我们在开发服务器上有一小部分可用的图像。

我熟悉使用url_for从 /static 文件夹中提供文件:

<img src="{{ url_for('static', filename='images/logo.png') }}"/>

我只想将 /static 文件夹用于应用程序相关的东西(如 js、css 和图像,如徽标和按钮图标——模板附带的东西)

该应用程序的主要数据是一个巨大的图像存储库。那是在 CDN 上,而不是在源代码中。

我想这样做:

<img src="{{ url_for('image_repo', filename=viewmodel.imagename) }}"/>

并将其转化为:

发展:

http://devbox/folder/images/blahblah.png

生产:

http://cdn.domain.com/bucket/blahblah.png

Flask 文档讨论了创建端点函数。我做的不对,因为它抛出了一个错误。错误不在此端点函数上,而是在 url_for 上。它说“werkzeug.routing.BuildError”并告诉我:BuildError: ('image_repo', {'filename': u'blahblah.png'}, None)

这是我的端点功能。我知道这是错的。

@app.endpoint('image_repo')
def image_repo(filename):
    # use settings to figure out if this is dev or prod
    # then what ????
    pass
4

1 回答 1

1

恐怕你不能url_for用来创建到另一个主机的链接(没有子域)。但是您可以创建自己的函数并使用它:

import urlparse

def image_repo_url_for(filename):
    if app.config['PRODUCTION']:
       return urlparse.urljoin(app.config['IMG_HOST_PROD'], filename)
    else:
       return urlparse.urljoin(app.config['IMG_HOST_DEV'], filename)

并将其添加到 jinja:

app.jinja_env.globals.update(image_repo_url_for=image_repo_url_for)
于 2013-06-29T16:11:46.777 回答