2016-03-06 86 views
8

在我的Flask應用程序中,我通過開發環境中的應用程序提供靜態資產,但我想在生產中使用CDN。所有資產裝入一個名爲base.hmtl模板,所以我想最簡單的解決方案是一個變量傳遞給渲染功能和類似的模板中使用它:從生產中的CDN而不是燒瓶中提供靜態文件

<script src="{{ STATIC_URL }}/js/main.js"></script> 

通常情況下這將是一個空字符串中的開發env和生產中的cdn url。我想避免將這個STATIC_URL變量傳遞給每個視圖。我可以使它的工作

@bp.context_processor 
def set_static_path(): 
    return dict(STATIC_URL='https://foo.bar.com') 

但對我來說這似乎有點hacky。有沒有更好的方法來解決這個問題?

回答

12

有沒有必要改變你如何鏈接到靜態文件,你仍然可以使用url_for('static', filename='myfile.txt')。如果已配置,則將默認靜態視圖替換爲重定向到CDN的靜態視圖。

from urllib.parse import urljoin 
# or for python 2: from urlparse import urljoin 
from flask import redirect 

@app.endpoint('static') 
def static(filename): 
    static_url = app.config.get('STATIC_URL') 

    if static_url: 
     return redirect(urljoin(static_url, filename)) 

    return app.send_static_file(filename) 

無論你是一個開發機或生產時,STATIC_URL配置值設置爲CDN和靜態文件的請求將被重定向那裏。


重定向相對便宜,並且被瀏覽器記住。如果您的性能受到了有意義的影響,那麼您可以編寫一個在使用CDN時直接鏈接的功能。

@app.template_global() 
def static_url(filename): 
    static_url = app.config.get('STATIC_URL') 

    if static_url: 
     return urljoin(static_url, filename) 

    return url_for('static', filename=filename) 

template_global修飾器使該功能在所有模板中都可用。當您需要用於靜態文件的URL時,請使用它而不是url_for

2

本燒瓶cdn integration guide可能值得一讀。基本上你可以安裝Flask-CDN extension並在你的app.py文件中定義你的CDN URL,如下所示:

from flask import Flask 
from flask.ext.cdn import CDN 

app = Flask(__name__) 
app.config['CDN_DOMAIN'] = 'cdn.yourdomain.com' 
CDN(app)