Flask用于为生产和开发中URL不同的资源创建URL

时间:2013-06-29 14:48:06

标签: python flask cdn

我的应用包含大量图片文件夹结构。在制作中,图像由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

1 个答案:

答案 0 :(得分: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)