Python 用于django介质的多个存储引擎:首选本地,回退到CDN

Python 用于django介质的多个存储引擎:首选本地,回退到CDN,python,django,rackspace,mezzanine,Python,Django,Rackspace,Mezzanine,我有一个django/mezzanine/django cumulus项目,它使用rackspace cloudfiles CDN进行媒体存储。我想自动为本地媒体根目录中的所有静态文件提供服务,如果它们存在,并且只有在它们不存在时才回退到CDN URL 一种可能的方法是使用标记在模板级别管理回退。然而,我不想为了这个而覆盖所有的管理模板(eg) 有没有办法修改所有媒体的处理方式,使其先使用一个存储引擎,然后切换到第二个打开错误?最好的办法是让它工作,就是让一个不同的web服务器为您的所有媒体服务

我有一个django/mezzanine/django cumulus项目,它使用rackspace cloudfiles CDN进行媒体存储。我想自动为本地媒体根目录中的所有静态文件提供服务,如果它们存在,并且只有在它们不存在时才回退到CDN URL

一种可能的方法是使用标记在模板级别管理回退。然而,我不想为了这个而覆盖所有的管理模板(eg)


有没有办法修改所有媒体的处理方式,使其先使用一个存储引擎,然后切换到第二个打开错误?

最好的办法是让它工作,就是让一个不同的web服务器为您的所有媒体服务(我使用的是nginx)。然后设置负载平衡器以检测故障,并在出现故障时将所有请求重定向到CDN。
您可能需要弄清楚的一件事是映像路径。(如果需要,可以使用HAProxy重写请求URL)

根据Anup的建议,我发现nginx配置的这一部分很好地处理了404条件:

location /static/ {
    root            /path/to/static_root;
    # ...
    error_page 404 =  @cdn;
}

location @cdn {
    # cdn_cname.example.com is an alias for deadbeef012345.r99.cf5.rackcdn.com
    rewrite ^/(.*)$ http://cdn_cname.example.com/$1 last;
}
这将正确地将本地服务器上返回404的/static/URI请求重定向到CDN。然而,django cumulus仍然通过CDN呈现到静态文件的链接。为了解决这个问题,我在settings.py的CUMULUS块中添加了以下内容:

CUMULUS {
    # ...
    'CONTAINER_URI': 'http://example.com/static',
}

现在,django cumulus链接使用本地服务器的静态URI,这将影响上面的nginx配置,并且仅在必要时重定向到CDN。万岁

一个有趣的想法。我认为负载平衡器是过度杀伤力;也许捕获404并重定向它们就足够了。这可以在Web服务器级别完成,或者使用django应用程序中的自定义404handler完成?我必须进行实验。对,在发布这篇文章之前,我认为破解core.context_processors.static是个好主意。但我真的不确定这样做是否正确。在执行返回{'STATIC\u URL':settings.STATIC\u URL}之前,我们需要进行检查。但是每一个请求都会发生这种情况,这肯定会影响应用程序的响应时间,因此我觉得我们不应该把它放在那里。让我们知道进展如何。啊。。我错过了nginx 404。这看起来很整洁。