ফ্লাস্কে স্ট্যাটিক ফাইলগুলি - robot.txt, সাইটম্যাপ.এক্সএমএল (mod_wsgi)


94

ফ্লাস্কের অ্যাপ্লিকেশন রুট ডিরেক্টরিতে স্থির ফাইলগুলি সঞ্চয় করার জন্য কোনও চতুর সমাধান রয়েছে। robots.txt এবং সাইটম্যাপ.এক্সএমএল / এ পাওয়া যাবে বলে আশা করা হচ্ছে, সুতরাং আমার ধারণা ছিল তাদের জন্য রুট তৈরি করা:

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

আরও কিছু সুবিধাজনক হতে হবে :)

উত্তর:


78

সর্বোত্তম উপায় হ'ল স্ট্যাটিক_উরাল_পথটি রুট ইউআরএলে সেট করা

from flask import Flask

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

এটি উল্লেখযোগ্য যে স্ট্যাটিক_ফোল্ডারটি প্রকল্প ফোল্ডারে থাকতে হবে না। যেমন স্ট্যাটিক_ফোল্ডার = '/ অ্যাপ / ইউআই' ঠিক আছে।
আশাক

66

@ ভনপেট্রেশেভ ঠিক বলেছেন, উত্পাদনে আপনি স্ট্র্যাটিক ফাইলগুলিকে এনজিনেক্স বা অ্যাপাচি দিয়ে পরিবেশন করতে চাইবেন তবে উন্নয়নের জন্য আপনার দেব পরিবেশ সহজ হবে আপনার অজগর অ্যাপটি স্ট্যাটিক বিষয়বস্তু পরিবেশন করার পাশাপাশি আপনার উদ্বেগের দরকার নেই কনফিগারেশন এবং একাধিক প্রকল্প পরিবর্তন সম্পর্কে। এটি করার জন্য, আপনি 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')
    })

এই উদাহরণটি ধরে নিয়েছে যে আপনার স্ট্যাটিক ফাইলগুলি "স্ট্যাটিক" ফোল্ডারে রয়েছে, যা আপনার পরিবেশের সাথে মানিয়ে যায়।


4
ধন্যবাদ! এটাই আমার দরকার! আমি আমার প্রযোজনার হিরকুর জন্য এটি করতে চাইছি। নিম্নলিখিত থ্রেডে উত্তরগুলি দেখুন: flask.pocoo.org/mailinglist/archive/2012/2/22/…
ডেভিড

4
হেড আপ - এখন এটি পরিচালনা করার একটি সহজ উপায়। আমার উত্তর পরীক্ষা করে দেখুন।
শন ম্যাকসোমিংথ

4
ভাগ করে নেওয়া ডেটা মিজডওয়ারের জন্য কেবল '/' এর সূচক 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 এ পুনঃনির্দেশের ফলাফল হওয়া উচিত নয়। (শিনের উত্তরে এটি কীভাবে অর্জন হয়েছে তা তাত্ক্ষণিকভাবে পরিষ্কার হয় না))
  • অ্যাপ রুট ফোল্ডারে স্থিতিশীল ফাইল যুক্ত করা পরিষ্কার নয় to
  • পরিশেষে, প্রস্তাবিত সমাধানটি অ্যাডমিশন মিডওয়্যারের সাথে যুক্ত করার চেয়ে আরও পরিষ্কার দেখায়:

23

যদিও এটি একটি পুরানো উত্তরযুক্ত প্রশ্ন, আমি এটির উত্তর দিচ্ছি কারণ গুগলের ফলাফলগুলিতে এই পোস্টটি বেশ উচ্চে উঠে এসেছে। এটি ডকুমেন্টেশনে আচ্ছাদিত নয়, আপনি যদি এটি ফ্ল্যাশ অ্যাপ্লিকেশন অবজেক্ট কনস্ট্রাক্টরের জন্য API ডক্স পড়েন । নামযুক্ত প্যারামিটারটি এভাবে পাস করে static_folder:

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

... আপনি স্থিতিশীল ফাইলগুলি কোথা থেকে পরিবেশন করা হয়েছে তা নির্ধারণ করতে পারেন। একইভাবে, আপনি একটি template_folder, আপনার নাম সংজ্ঞায়িত করতে পারেন static_url_path


@ চিমিকে হ্যাঁ, এটি ডিফল্ট হয় /staticতবে আপনি ওভাররাইড করে এটিকে পরিবর্তন করতে পারেন static_url_path
শান ম্যাকসোমিংথ

এটি সঠিক তবে অন্যান্য উত্তরগুলি আরও নমনীয়। এটি কেবলমাত্র একটি ডিরেক্টরি পাথ পরিবেশন করতে পারে তার দ্বারা এটি সীমাবদ্ধ।
থমাস ডিগানান

এটি মূল প্রশ্নের উত্তর নয়।
পাওলো ক্যাসিয়েলো

4
আপনি যদি "" স্ট্যাটিক_উর_পথ সেট করেন তবে আপনি / থেকে ফাইল পরিবেশন করতে পারেন।
Beau

এটি ফ্লাস্ককে স্ট্যাটিক ফাইলগুলি সরবরাহ করতে বাধ্য করে। আপনি যদি এনজিনেক্স বা এপাচি তাদের পরিবেশন করতে চান?
মার্কন

15

স্ট্যাটিক ফাইলগুলি পরিবেশন করার সাথে অ্যাপ্লিকেশনটির কোনও সম্পর্ক নেই যা গতিশীল সামগ্রী সরবরাহ করতে বোঝায় to স্ট্যাটিক ফাইলগুলি পরিবেশন করার সঠিক উপায়টি আপনি কোন সার্ভারটি ব্যবহার করছেন তার উপর নির্ভরশীল। সর্বোপরি, আপনি যখন নিজের অ্যাপটি চালু এবং চলমান করবেন তখন আপনাকে এটি একটি ওয়েব সার্ভারে আবদ্ধ করতে হবে। আমি কেবল অ্যাপাচি httpd এর জন্য কথা বলতে পারি, সুতরাং স্থির ফাইলগুলির পরিবেশন করার পদ্ধতিটি ভার্চুয়াল হোস্টে সংজ্ঞায়িত করা হয় যে আপনি মোড-ডাব্লুএসজি মাধ্যমে আপনার অ্যাপ্লিকেশনকে বাধ্য করছেন। এখানে গাইড যা আপনাকে দেখায় যে কীভাবে সাইটম্যাপ, রোবটস.টেক্সট বা যে কোনও স্থিতিশীল বিষয়বস্তু পরিবেশন করতে হবে: http://code.google.com/p/modwsgi/wiki/QuickConfigrationGuide#Mounting_At_Root_Of_Site


এই উত্তরটি আমি খুঁজছি। ধন্যবাদ!
বিসিয়াদ

4
একটি অ্যাপ্লিকেশন বোঝানো হয়েছে সামগ্রী সরবরাহ করা, কিছু গতিশীল এবং কিছু স্থিতিশীল।
ডেম পাইলাফিয়ান

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()

4
হেড আপ - এখন এটি পরিচালনা করার একটি সহজ উপায়। আমার উত্তর পরীক্ষা করে দেখুন।
শন ম্যাকসোমিংথ

দুর্দান্ত উপায় যদি আপনার একাধিক পথ পরিবেশন করতে হয়!
থমাস ডিগানান

6

এই প্রশ্নটি জিজ্ঞাসা করার পরে এটি যুক্ত করা যেতে পারে, তবে আমি ফ্লাস্কের "সহায়ক"

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.
'''

... যা flask.send_file রেফারেন্স:

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

... যা আরও নিয়ন্ত্রণের জন্য আরও ভাল বলে মনে হচ্ছে, যদিও সেন্ড_ফর্ম_ডাইরেক্টরি ** অপশন সরাসরি সেন্ড_ফাইলে দিয়ে যায়।


3

এখানে ডকুমেন্টেশন থেকে: http://flask.pocoo.org/docs/quickstart/#static-files

ডায়নামিক ওয়েব অ্যাপ্লিকেশনগুলির পাশাপাশি স্ট্যাটিক ফাইলও প্রয়োজন। সিএসএস এবং জাভাস্ক্রিপ্ট ফাইলগুলি এখান থেকে আসে। আদর্শভাবে আপনার ওয়েব সার্ভারটি তাদের জন্য পরিবেশন করার জন্য কনফিগার করা হয়েছে, তবে বিকাশের সময় ফ্লাস্ক সেটিও করতে পারে। আপনার প্যাকেজটিতে বা আপনার মডিউলের পাশেই কেবল স্ট্যাটিক নামে একটি ফোল্ডার তৈরি করুন এবং এটি অ্যাপ্লিকেশনটিতে / স্থিতিতে পাওয়া যাবে।

ইউআরএলটির সেই অংশে ইউআরএল তৈরি করতে, বিশেষ 'স্ট্যাটিক' ইউআরএল নামটি ব্যবহার করুন:

url_for ('স্ট্যাটিক', ফাইলের নাম = 'স্টাইল। CSS')

স্ট্যাটিক / স্টাইল। CSS হিসাবে ফাইলটি ফাইল সিস্টেমে সংরক্ষণ করতে হবে।


0

আমারও একই রকম দ্বিধা হচ্ছে। কিছু অনুসন্ধান করে আমার উত্তর খুঁজে পেয়েছে (এমএইচও):

ডকুমেন্টেশন থেকে পাশাপাশি উদ্ধৃতি হতে পারে

ডায়নামিক ওয়েব অ্যাপ্লিকেশনগুলির পাশাপাশি স্ট্যাটিক ফাইলও প্রয়োজন। সিএসএস এবং জাভাস্ক্রিপ্ট ফাইলগুলি এখান থেকে আসে That's আদর্শভাবে আপনার ওয়েব সার্ভারটি তাদের জন্য পরিবেশন করার জন্য কনফিগার করা হয়েছে, তবে বিকাশের সময় ফ্লাস্ক সেটিও করতে পারে । আপনার প্যাকেজটিতে বা আপনার মডিউলের পাশেই কেবল স্ট্যাটিক নামে একটি ফোল্ডার তৈরি করুন এবং এটি অ্যাপ্লিকেশনটিতে / স্থিতিতে পাওয়া যাবে।

আইএমএইচও: যখন আপনার অ্যাপ্লিকেশন উত্পাদনের জন্য প্রস্তুত হয় , স্থির ফাইল পরিবেশন ওয়েবসারভারে (বা আদর্শ) কনফিগার করা উচিত (এনগিনেক্স, অ্যাপাচি); তবে উন্নয়নের সময় , ফ্লাস্ক এটি স্ট্যাটিক ফাইলগুলি সরবরাহ করার জন্য উপলব্ধ করে। এটি আপনাকে দ্রুত বিকাশে সহায়তা করতে পারে - ওয়েবসার্ভার এবং এই জাতীয় সেটআপ করার দরকার নেই।

আশা করি এটা সাহায্য করবে.


0

এটা চেষ্টা কর:

@app.route("/ProtectedFolder/<path:filename>")
@CheckUserSecurityAccessConditions
def Protect_Content(filename):
  return send_from_directory((os.path.join(os.path.dirname(__file__), 'ProtectedFolder')),filename)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.