2016-03-06 13 views
8

私のFlaskアプリケーションでは、dev envのアプリを通じて静的資産を提供していますが、実動環境でCDNを使用したいと思います。すべての資産はbase.hmtlと呼ばれるテンプレートにロードされたので、私は最も簡単な解決策は、レンダリング関数に変数を渡すなど、テンプレートでそれを使用することです推測されます。生産現場でFlaskではなくCDNから静的ファイルを提供

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

通常、それは、devに空の文字列になりますenv、cdn urlを生成します。私はすべてのビューにこのSTATIC_URL変数を渡すことを避けたいと思います。私はそれを動作させることができる

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

しかし、これは少しハッキリのようです。この問題を解決する良い方法はありますか?

答えて

12

静的ファイルへのリンク方法を変更する必要はありませんが、url_for('static', filename='myfile.txt')を使用することはできます。 CDNが設定されている場合は、デフォルトの静的ビューをCDNにリダイレクトするものに置き換えます。あなたがのdevのマシンや生産にしているかどうか

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) 

は、CDNにSTATIC_URL設定値を設定し、静的ファイルの要求があっリダイレクトされます。


リダイレクトは比較的安価で、ブラウザによって記憶されます。パフォーマンスが意味を持つようになると、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) 
関連する問題