फ्लास्क में स्टेटिक फ़ाइलें - robot.txt, sitemap.xml (mod_wsgi)


94

क्या फ्लास्क की एप्लिकेशन रूट डायरेक्टरी में स्टैटिक फाइल्स को स्टोर करने का कोई चतुर उपाय है। robots.txt और sitemap.xml / में मिलने की उम्मीद है, इसलिए मेरा विचार उनके लिए मार्ग बनाने का था:

@app.route('/sitemap.xml', methods=['GET'])
def sitemap():
  response = make_response(open('sitemap.xml').read())
  response.headers["Content-type"] = "text/plain"
  return response

अधिक सुविधाजनक कुछ होना चाहिए :)

जवाबों:


78

सबसे अच्छा तरीका है static_url_path को root url सेट करना

from flask import Flask

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

यह उल्लेखनीय है कि static_folder प्रोजेक्ट फ़ोल्डर में होना आवश्यक नहीं है। उदा। static_folder = '/ app / ui' ठीक है।
आशिक

66

@vonPetrushev सही है, उत्पादन में आप nginx या अपाचे के माध्यम से स्थिर फ़ाइलों की सेवा करना चाहते हैं, लेकिन विकास के लिए यह अच्छा है कि आपका देव वातावरण सरल हो और आपका अजगर ऐप स्थैतिक सामग्री की सेवा कर सके, इसलिए आपको चिंता करने की आवश्यकता नहीं है। विन्यास और कई परियोजनाओं को बदलने के बारे में। ऐसा करने के लिए, आप SharedDataMiddleware का उपयोग करना चाहेंगे

from flask import Flask
app = Flask(__name__)
'''
Your app setup and code
'''
if app.config['DEBUG']:
    from werkzeug import SharedDataMiddleware
    import os
    app.wsgi_app = SharedDataMiddleware(app.wsgi_app, {
      '/': os.path.join(os.path.dirname(__file__), 'static')
    })

यह उदाहरण मानता है कि आपकी स्थिर फाइलें फ़ोल्डर में हैं "स्थिर", जो भी आपके वातावरण में फिट बैठता है उसके लिए समायोजित करें।


1
धन्यवाद! यह वही है जो मुझे चाहिए था! मैं अपने उत्पादन के लिए यह करना चाह रहा हूँ। निम्नलिखित धागे पर उत्तर देखें: flask.pocoo.org/mailinglist/archive/2012/2/22/…
डेविड

2
शीर्षासन - अब इसे संभालने का एक आसान तरीका है। मेरा उत्तर जांचें।
शॉन मैकसमरेटिंग

1
क्या SharedDataMieldware के लिए index.html या इसी तरह के सिर्फ '/' को हल करना है?
ग्रोमगुल

63

इस सवाल का साफ जवाब है इस सवाल का जवाब यह (समान) के लिए प्रश्न :

from flask import Flask, request, send_from_directory
app = Flask(__name__, static_folder='static')    

@app.route('/robots.txt')
@app.route('/sitemap.xml')
def static_from_root():
    return send_from_directory(app.static_folder, request.path[1:])

संक्षेप में:

  • जैसा कि डेविड ने बताया, राइट कॉन्फिग के साथ यह कुछ स्थिर फाइलों को ठेस के माध्यम से परोसना ठीक है
  • /robots.txt की तलाश में /static/robots.txt को पुनर्निर्देशित नहीं किया जाना चाहिए। (सीन्स उत्तर में यह तुरंत स्पष्ट नहीं है कि यह कैसे हासिल किया जाता है।)
  • एप्लिकेशन रूट फ़ोल्डर में स्थिर फ़ाइलों को जोड़ने के लिए यह साफ नहीं है
  • अंत में, प्रस्तावित समाधान जोड़ने वाले मिडलवेयर दृष्टिकोण की तुलना में बहुत साफ दिखता है:

23

भले ही यह एक पुराना उत्तर दिया गया प्रश्न है, मैं इसका उत्तर दे रहा हूं क्योंकि यह पोस्ट Google परिणामों में बहुत ऊपर आती है। हालांकि यह दस्तावेज़ीकरण में शामिल नहीं है, यदि आप फ्लास्क एप्लीकेशन ऑब्जेक्ट कंस्ट्रक्टर के लिए एपीआई डॉक्स पढ़ते हैं तो यह कवर किया जाता है। static_folderजैसे नामांकित पैरामीटर को पास करके :

from flask import Flask
app = Flask(__name__,
            static_folder="/path/to/static",
            template_folder="/path/to/templates")

... आप परिभाषित कर सकते हैं कि स्थिर फाइलें कहाँ से परोसी जाती हैं। इसी तरह, आप एक template_folder, आप के नाम को परिभाषित कर सकते हैं static_url_path


@chmike हाँ, यह चूक करता है /staticलेकिन आप इसे ओवरराइड करके बदल सकते हैं static_url_path
शॉन मैकसमर्थिंग

यह सही है लेकिन अन्य उत्तर अधिक लचीले हैं। यह एक तथ्य से सीमित है यह केवल एक निर्देशिका पथ की सेवा कर सकता है।
थॉमस डिगन

यह मूल प्रश्न का उत्तर नहीं है।
पाओलो कैसिसेलो

2
यदि आप static_url_path को "" सेट करते हैं तो आप / से फाइल परोस सकते हैं।
ब्यू

यह फ्लास्क को स्टैटिक फाइल्स परोसने के लिए मजबूर करता है। यदि आप उन्हें सेवा देने के लिए नगनेक्स या अपाचे चाहते हैं तो क्या होगा?
मार्कॉन

15

स्थैतिक फ़ाइलों की सेवा का ऐसे अनुप्रयोग से कोई लेना-देना नहीं है, जो डायनामिक सामग्री वितरित करने के लिए है। स्थैतिक फ़ाइलों की सेवा का सही तरीका इस बात पर निर्भर करता है कि आप किस सर्वर का उपयोग कर रहे हैं। आखिरकार, जब आप अपना ऐप अप करते हैं और रनिंग करते हैं, तो आपको इसे एक वेब सर्वर से बांधना होगा। मैं केवल अपाचे httpd के लिए बोल सकता हूं, इसलिए स्थैतिक फ़ाइलों की सेवा करने का तरीका वर्चुअल होस्ट में परिभाषित किया गया है जिसे आप mod-wsgi के माध्यम से अपने आवेदन के लिए बाध्य कर रहे हैं। यहां वह मार्गदर्शिका दी गई है जो आपको दिखाएगी कि कैसे साइटमैप, robots.txt या किसी स्थिर सामग्री की सेवा करें: http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Mounting_At_Rot_Of_Site


यही कारण है कि मैं जवाब के लिए देख रहा हूँ। धन्यवाद!
biesiad

1
एक आवेदन सामग्री, कुछ गतिशील और कुछ स्थिर वितरित करने के लिए है।
डेम पिलाफियन

14

स्टैटिक फाइल्स भेजने का एक और तरीका इस तरह से कैच-ऑल नियम का उपयोग करना है:

@app.route('/<path:path>')
def catch_all(path):
    if not app.debug:
        flask.abort(404)
    try:
        f = open(path)
    except IOError, e:
        flask.abort(404)
        return
    return f.read()

मैं इसका उपयोग विकासशील होने पर सेट-अप को कम करने की कोशिश करने के लिए करता हूं। मुझे http://flask.pocoo.org/snippets/57/ से आइडिया मिला

इसके अलावा, मैं अपने स्टैंडअलोन मशीन पर फ्लास्क का उपयोग कर विकसित कर रहा हूं लेकिन उत्पादन सर्वर में अपाचे के साथ तैनाती कर रहा हूं। मैं उपयोग करता हूं:

file_suffix_to_mimetype = {
    '.css': 'text/css',
    '.jpg': 'image/jpeg',
    '.html': 'text/html',
    '.ico': 'image/x-icon',
    '.png': 'image/png',
    '.js': 'application/javascript'
}
def static_file(path):
    try:
        f = open(path)
    except IOError, e:
        flask.abort(404)
        return
    root, ext = os.path.splitext(path)
    if ext in file_suffix_to_mimetype:
        return flask.Response(f.read(), mimetype=file_suffix_to_mimetype[ext])
    return f.read()

[...]

if __name__ == '__main__':
    parser = optparse.OptionParser()
    parser.add_option('-d', '--debug', dest='debug', default=False,
                      help='turn on Flask debugging', action='store_true')

    options, args = parser.parse_args()

    if options.debug:
        app.debug = True
        # set up flask to serve static content
        app.add_url_rule('/<path:path>', 'static_file', static_file)
    app.run()

1
शीर्षासन - अब इसे संभालने का एक आसान तरीका है। मेरा उत्तर जांचें।
शॉन मैकसमरिंग

यदि आपको कई रास्तों की सेवा करने की आवश्यकता है, तो उत्कृष्ट तरीका है!
थॉमस डिगन

6

यह प्रश्न पूछे जाने के बाद से इसे जोड़ा जा सकता था, लेकिन मैं फ्लास्क के "हेल्पर्सडैम" के माध्यम से देख रहा था और मुझे फ्लास्क मिला। send_from_directory:

send_from_directory(directory, filename, **options)
'''
  send_from_directory(directory, filename, **options)
  Send a file from a given directory with send_file.  This
  is a secure way to quickly expose static files from an upload folder
  or something similar.
'''

... जो संदर्भ फ्लास्क.सेंड_फाइल:

send_file(filename_or_fp, mimetype=None, as_attachment=False, attachment_filename=None, add_etags=True, cache_timeout=43200, conditional=False)

... जो अधिक नियंत्रण के लिए बेहतर लगता है, हालांकि send_from_directory pass_file के माध्यम से सीधे ** विकल्प देता है।


3

यहाँ प्रलेखन से: http://flask.pocoo.org/docs/quickstart/#static-files

डायनामिक वेब एप्लिकेशन को स्थिर फ़ाइलों की भी आवश्यकता होती है। आमतौर पर सीएसएस और जावास्क्रिप्ट फाइलें कहां से आ रही हैं। आदर्श रूप से आपके वेब सर्वर को आपके लिए उनकी सेवा के लिए कॉन्फ़िगर किया गया है, लेकिन विकास के दौरान फ्लास्क ऐसा भी कर सकते हैं। बस अपने पैकेज में या अपने मॉड्यूल के बगल में स्थिर नामक एक फ़ोल्डर बनाएं और यह एप्लिकेशन पर / स्थिर पर उपलब्ध होगा।

URL के उस भाग में URL उत्पन्न करने के लिए, विशेष 'static' URL नाम का उपयोग करें:

url_for ('स्थिर', फ़ाइल नाम = 'style.css')

फ़ाइल को फ़ाइल सिस्टम पर स्थिर / style.css के रूप में संग्रहीत किया जाना है।


0

मुझे भी यही दुविधा हो रही है। कुछ खोज की और मेरा उत्तर पाया (MHO):

साथ ही प्रलेखन से उद्धरण हो सकता है

डायनामिक वेब एप्लिकेशन को स्थिर फ़ाइलों की भी आवश्यकता होती है। आमतौर पर सीएसएस और जावास्क्रिप्ट फाइलें कहां से आ रही हैं। आदर्श रूप से आपके वेब सर्वर को आपके लिए उनकी सेवा के लिए कॉन्फ़िगर किया गया है, लेकिन विकास के दौरान फ्लास्क ऐसा भी कर सकते हैं । बस अपने पैकेज में या अपने मॉड्यूल के बगल में स्थिर नामक एक फ़ोल्डर बनाएं और यह एप्लिकेशन पर / स्थिर पर उपलब्ध होगा।

IMHO: जब आपका आवेदन उत्पादन के लिए है , स्थैतिक फ़ाइल सेवारत (या आदर्श रूप से) वेबसर्वर (nginx, apache) पर कॉन्फ़िगर किया जाना चाहिए; लेकिन विकास के दौरान , फ्लास्क ने इसे स्थिर फ़ाइलों की सेवा के लिए उपलब्ध कराया। यह आपको तेजी से विकसित करने में मदद करने के लिए है - वेबसर्वर और ऐसे सेटअप करने की कोई आवश्यकता नहीं है।

आशा करता हूँ की ये काम करेगा।


0

इसे इस्तेमाल करे:

@app.route("/ProtectedFolder/<path:filename>")
@CheckUserSecurityAccessConditions
def Protect_Content(filename):
  return send_from_directory((os.path.join(os.path.dirname(__file__), 'ProtectedFolder')),filename)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.