2012-02-25 20 views
13

पर होस्ट किया गया फ्लास्क static_folder मैं अमेज़ॅन एस 3 पर होस्ट करने के लिए अपनी सभी/स्थिर सामग्री को फिर से शुरू करने की कोशिश कर रहा हूं। मेरा पहला विचार था कि मेरे जिन्जा टेम्पलेट्स में ग्लोबल कॉन्फिग ['पथ'] का उपयोग करना था, लेकिन यह बाहरी सीएसएस और जेएस फाइलों के लिए काम नहीं करेगा, साथ ही यह गन्दा है। मैंने static_folder और static_url_path को 0.7 में रिलीज़ किया और ऐसा लगता है कि मैं क्या चाहता हूं। हालांकि, जब मैं http://localhost:8000/static/img/abc.jpg पर जाता हूं तो यह S3 पर फ़ाइलों का पता नहीं लगाता है। क्या मैं इस सुविधा का सही उपयोग कर रहा हूं या ऐसा करने का कोई और तरीका है?एस 3

धन्यवाद!

उत्तर

1

आप क्या हासिल करने की कोशिश कर रहे हैं

{{ url_for(app.static, file='img/abc.jpg', _external=True) }}

लिखने और S3 में एक यूआरएल है कि संकल्प के लिए सक्षम होने के लिए है?

मेरा मानना ​​है कि static_folder और static_url_path सेटअप कर रहे हैं कि यदि आप फोन

app = Application('app', static_folder='foo', static_url_path='bar')

तो

के लिए जा रहा ऊपर url_for होगा उत्पादन

http://localhost:8000/bar/img/abc.jpg और उस में static/img/abc.jpg के लिए विचार करेंगे फाइल सिस्टम

मुझे लगता है कि क्या आप संभावित है कि एक S3 यूआरएल के लिए अपने पथ अनुवाद होगा कस्टम फ़िल्टर लिखने करना ताकि आप जैसे

{{ 'img/abc.jpg'|s3_static_url }}

एक फोन कुछ कर सकता है चाहता हूँ इस पर कुछ प्रलेखन है यहाँ : flask custom filters

0

आपको http://localhost:8000/static/img/abc.jpg के बजाय अमेज़ॅन एस 3 सार्वजनिक फ़ाइल यूआरएल की आवश्यकता है। अगर इसकी कुछ फाइलें हैं, तो शायद उन्हें अपने यूआरएल में पूर्ण यूआरएल के साथ हार्डकोड करें या यदि आप उत्पादन साइट पर एस 3 का परीक्षण और उपयोग करने के लिए स्थानीय संस्करण के लिए जा रहे हैं (जैसे हम करते हैं) तो आप निम्न विधि को आजमा सकते हैं।

अपने बेस टेम्पलेट (जो अन्य टेम्पलेट्स उत्तराधिकारी) के शीर्ष पर STATIC_ROOT नामक एक नए चर को परिभाषित करें, और फ़ाइल पथ उपसर्ग के रूप में उपयोग करें।

उदाहरण के लिए:

{% if app.debug %} 
    {% set STATIC_ROOT = url_for('static', filename='') %} 
{% else %} 
    {% set STATIC_ROOT = 'http://s3.amazonaws.com/bucketname/' } 
{% endif %} 

यह है जब आप अपने आवेदन स्थानीय रूप से परीक्षण किया जा सकता है आप डिफ़ॉल्ट पथ दे देंगे, और सार्वजनिक S3 यूआरएल उत्पादन में (डिबग ध्वज के आधार पर) है।

यह का उपयोग करना:

<script src="{{ STATIC_ROOT }}js/jquery.min.js">

+0

बदसूरत, कोई ज़रूरत नहीं है। चर सेट करने के लिए बस एक संदर्भ प्रोसेसर का उपयोग करें। –

6

काश flask.Flask निर्माता के static_url_path तर्क एक पूर्ण यूआरआई को स्वीकार करेंगे, लेकिन यह रास्ता एक अग्रणी स्लैश की आवश्यकता होगी, जब आप उस कोशिश के बारे में चिल्लाती है। अगर इसे स्वीकार किया जाता है, तो आप static_url_path='http://my_s3_bucket.aws.amazon.com/' या फिर सेट करने के बाद url_for का उपयोग कर सकते हैं।

एक और संभावित समाधान एक संदर्भ प्रोसेसर का उपयोग करना है। मेरा मानना ​​है कि यह सबसे साफ समाधान है, लेकिन मुझे फ्लास्क के साथ ज्यादा अनुभव नहीं है। यह सुनिश्चित करें कि साफ दिखता है।एक संदर्भ प्रोसेसर का उपयोग करके, मैं पर्यावरण से यूआरएल खींचता हूं (मैं उसकेोकू का उपयोग कर रहा हूं इसलिए इसे सेट करना आसान है)। फिर संदर्भ प्रोसेसर static_url चर मेरे टेम्पलेट्स में उपलब्ध कराता है।

app.py में:

# Environment has STATIC_URL='http://my_s3_bucket.aws.amazon.com/' 
@app.context_processor 
def inject_static_url(): 
    """ 
    Inject the variable 'static_url' into the templates. Grab it from 
    the environment variable STATIC_URL, or use the default. 

    Template variable will always have a trailing slash. 

    """ 
    static_url = os.environ.get('STATIC_URL', app.static_url_path) 
    if not static_url.endswith('/'): 
     static_url += '/' 
    return dict(
     static_url=static_url 
    ) 

टेम्पलेट में:

<link rel="stylesheet" type="text/css" href="{{ static_url }}css/main.css" /> 

परिणाम

<link rel="stylesheet" type="text/css" href="http://my_s3_bucket.aws.amazon.com/css/main.css" /> 
8

मैं हाल ही में devel इस स्थिति से निपटने के लिए फ्लास्क एक्सटेंशन का चयन किया। इसे Flask-S3 कहा जाता है, और आप इसके लिए प्रलेखन here पढ़ सकते हैं।

>>> from my_application import app 
>>> from flask_s3 import create_all 
>>> create_all(app) 

Flask-:

from flask import Flask 
from flask_s3 import FlaskS3 

app = Flask(__name__) 
app.config['S3_BUCKET_NAME'] = 'mybucketname' 
s3 = FlaskS3(app) 

आप अपने चुने हुए बाल्टी के लिए अपनी संपत्ति अपलोड करने के लिए एक्सटेंशन का उपयोग कर सकते हैं:

एक उदाहरण के रूप में, यहाँ कैसे आप इसे अपने बोतल आवेदन में एकीकृत होता है एस 3 ब्लूप्रिंट जागरूक है, और पंजीकृत ब्लूप्रिंट से जुड़े सभी संपत्तियों को अपलोड करेगा।

0

मुझे पता है कि यह एक पुराना सवाल है, लेकिन यहां मैं इस मुद्दे को कैसे प्राप्त करता हूं।

  • आयात बोतल के एक अलग नाम से url_for विधि (जैसे, flask_url_for)
  • अपनी खुद की कस्टमurl_for विधि है, जो flask_url_for कॉल और फिर अपने S3 बाल्टी यूआरएल में जोड़ने के लिए स्ट्रिंग प्रतिस्थापन का उपयोग किया गया।

मुझे यह रणनीति पसंद है क्योंकि यह उपयोग करने में आसान और सहज है, और इंटरफ़ेस मूल url_for विधि की तरह है।

from flask import url_for as flask_url_for 
from flask import current_app 

PRODUCTION_URL = 'https://s3.amazonaws.com/MY-BUCKET-NAME' 

def url_for(path, **kwargs): 
    url = flask_url_for(path, **kwargs) 
    if url.startswith("/static") and not current_app.debug: 
     url = url.replace("/static", "", 1) 
     return PRODUCTION_URL + url 
    return url