2016-03-06 4 views
8

मेरे फ्लास्क ऐप में मैं देव env में ऐप के माध्यम से स्थैतिक संपत्तियों की सेवा करता हूं, लेकिन मैं उत्पादन में सीडीएन का उपयोग करना चाहता हूं। प्रत्येक संपत्ति base.hmtl नामक एक टेम्पलेट में भरी हुई है, इसलिए मुझे लगता है कि सबसे आसान समाधान समारोह प्रस्तुत करने के लिए एक चर गुजरती हैं और तरह टेम्पलेट में इसका इस्तेमाल करने के लिए है: देव में कोई रिक्त स्ट्रिंग आम तौर पर यह होगाउत्पादन में फ्लास्क के बजाय सीडीएन से स्थैतिक फाइलों की सेवा

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

एनवी, और उत्पादन में सीडीएन यूआरएल। मैं इस दृश्य को STATIC_URL चर से गुज़रने से बचना चाहता हूं। मैं इसे

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

के साथ काम कर सकता है लेकिन मेरे लिए यह थोड़ा हैकी लगता है। क्या इस समस्या को हल करने का कोई बेहतर तरीका है?

उत्तर

12

स्थिर फ़ाइलों से लिंक करने के तरीके को बदलने की कोई आवश्यकता नहीं है, फिर भी आप url_for('static', filename='myfile.txt') का उपयोग कर सकते हैं। डिफ़ॉल्ट स्थिर दृश्य को उस व्यक्ति के साथ बदलें जो सीडीएन पर रीडायरेक्ट करता है यदि यह कॉन्फ़िगर किया गया है।

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 config मान सेट और स्थिर फ़ाइलों के लिए अनुरोध वहाँ पुनः निर्देशित किया जाएगा।


रीडायरेक्ट अपेक्षाकृत सस्ते हैं, और ब्राउज़र द्वारा याद किए जाते हैं। यदि आप उस बिंदु पर पहुंचते हैं जहां प्रदर्शन उनके द्वारा अर्थात् प्रभावित होता है, तो आप एक ऐसा फ़ंक्शन लिख सकते हैं जो सीडीएन का उपयोग करते समय सीधे लिंक हो।

@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_for के बजाय इसका उपयोग करें।

2

यह फ्लास्क सीडीएन integration guide पढ़ने के लायक हो सकता है। असल में आप Flask-CDN extension इंस्टॉल कर सकते हैं और अपनी सीडीएन यूआरएल को अपनी एपीटीवी फाइल में परिभाषित कर सकते हैं जैसे:

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

app = Flask(__name__) 
app.config['CDN_DOMAIN'] = 'cdn.yourdomain.com' 
CDN(app) 
संबंधित मुद्दे