2013-07-16 6 views
8

मैं एक html फ़ाइल का संदर्भ देता है जो इसsend_from_directory से फ़ाइलें() फ्लास्क में

<img src="img/snacks.png"> 
<link href="css/bluestrap.css" rel="stylesheet"> 

इसलिए ब्राउज़र के माध्यम से इस कॉल करने के लिए कोशिश करता है और कुप्पी तो

http://127.0.0.1:5000/img/snacks.png 
करने के लिए विफल रहता है की तरह स्थिर वस्तु है प्राप्त करने में असमर्थ

कई फाइलों में ऐसे कई संदर्भ हैं इसलिए संदर्भ बदलना संभव नहीं है। कैसे मैं फ्लास्क

मैं 'स्थिर' फ़ोल्डर में इन सभी स्टैटिक फ़ाइलें नकल की और कोशिश की इस

@app.route('/<path:filename>') 
def send_file(filename): 
     return send_from_directory('/static', filename) 

हालांकि यह काम नहीं करता है से इन स्टैटिक फ़ाइलें की सेवा करते हैं, वहाँ यह करने के लिए किसी भी अन्य रास्ता नहीं है ? या मैं गलत क्या कर रहा हूँ?

उत्तर

14

उत्पादन में, आप फ्लास्क सर्वर का उपयोग कर स्थिर फ़ाइलों की सेवा नहीं करना चाहते हैं। मेरा सुझाव है कि आप ऐसा करने के लिए एक उचित वेब सर्वर का उपयोग करें।

देव के लिए, क्योंकि आप url_for का उपयोग नहीं करना चाहते हैं, तो आप नीचे दिए गए अपने फ्लास्क ऐप को प्रारंभ करने का प्रयास कर सकते हैं। इस तरह, फ्लास्क जानता है कि आपकी स्थिर फाइलें कहां हैं।

app = Flask(__name__, static_folder='static') 

@app.route('/<path:filename>') 
def send_file(filename): 
    return send_from_directory(app.static_folder, filename) 

जानकारी का एक बहुत कुछ के साथ यह पोस्ट देखें Static files in Flask - robot.txt, sitemap.xml (mod_wsgi)

+0

url_for फ़ंक्शन का उपयोग करके उन्हें बदलने के लिए छवियों/सीएसएस फ़ाइलों के बहुत सारे संदर्भ हैं, इसलिए मैं उन्हें बदलना नहीं चाहता हूं। क्या HTML फ़ाइल को बदलने और अभी भी उन्हें अजगर से सेवा करने का कोई तरीका नहीं है? –

2

आप send_from_directory के लिये दस्तावेज को देखें, तो आप देखेंगे कि यह निर्देशिका जिसमें फ़ाइलें डिस्क पर आयोजित कर रहे हैं के लिए पथ लेता है। जब तक आप अपने छवि फ़ाइलों static नाम के एक रूट स्तर निर्देशिका में बचाया है, तो आप अपने फ़ाइल पथ अद्यतन करने के लिए चाहता हूँ:

send_from_directory("/some/path/to/static", "my_image_file.jpg") 

कहा जा रहा है, अगर आप कुछ भी करने के लिए इस का उपयोग कर रहे हैं कि किसी भी लोड के तहत किया जाएगा , यह सुनिश्चित करना बेहतर है कि आपके वेब सर्वर आपके एप्लिकेशन से स्थिर फ़ाइलों की सेवा करने के बजाय फ़ाइलों की सेवा करता है।

+0

मेरी फ़ाइलें 'स्थिर' नामक रूट स्तर निर्देशिका के अंदर 'img' नामक फ़ोल्डर में संग्रहीत हैं, इसलिए प्रभावी रूप से स्थिर/img/snacks पर संग्रहीत किया जाता है।पीएनजी और ब्राउजर कॉल http://127.0.0.1:52000/img/snacks.png –

+0

@RijulJain - हाँ, लेकिन क्या यह डिस्क डिस्क पर 'static' पर स्थित है? यही है, यह आपके * फाइल सिस्टम * (आपके वेबसर्वर रूट नहीं) में 'usr',' आदि 'के आगे है और '/' के नीचे है? –

+0

यह मेरे वेबसर्वर रूट में है, मैं अपने वेबसर्वर रूट से संबंधित पथ कैसे दे सकता हूं? –

3

उत्पादन में फ्लास्क के अंतर्निर्मित सर्वर का उपयोग न करें। यह केवल विकास के लिए है! और स्थैतिक संपत्तियों की सेवा के लिए फ्लास्क का उपयोग न करें। ये धीमा है! उत्पादन में फ्लास्क के सामने apache2, nginx या lighttpd जैसे वेबसर्वर का उपयोग करें। ये सर्वर एक यूआरएल को फिर से लिखने और स्थिर संपत्तियों को सेवा देने में सक्षम हैं।

बोतल कैसे तैनात करने के लिए: apache2, nginx, lighttpd: http://flask.pocoo.org/docs/deploying/

कैसे एक यूआरएल के पुनर्लेखन के लिए।

1

मुझे लगता है कि यह करने के लिए एक बेहतर तरीका होगा:

import flask 

# ... 

@app.route('/img/<fname>') 
def legacy_images(fname): 
    return flask.redirect(flask.url_for('static', filename='img/' + fname), code=301) 

इसके बजाय दो अलग-अलग स्थानों पर फ़ाइलों को भेजने की, इस एक स्थाई रीडायरेक्ट उचित यूआरएल के लिए करना होगा। जैसा कि अन्य ने कहा है, यह भी nginx या अपाचे के साथ स्थिर फ़ाइलों को सेवा देने का एक अच्छा विचार है।