سؤال

هل هناك أي حل ذكي لتخزين الملفات الثابتة في دليل جذر تطبيق Flask. من المتوقع العثور على 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

يجب أن يكون هناك شيء أكثر ملاءمة :)

هل كانت مفيدة؟

المحلول

أفضل طريقة هي ضبط static_url_path إلى عنوان URL الجذر

from flask import Flask

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

نصائح أخرى

VonPetrushev على حق ، في الإنتاج ، ستحتاج إلى تقديم ملفات ثابتة عبر Nginx أو Apache ، ولكن من الجيد أن يكون من الجيد أن تكون بيئة Dev بسيطة في تقديم تطبيق Python الخاص بك إلى المحتوى الثابت أيضًا حتى لا تقلق حول تغيير التكوينات والمشاريع المتعددة. للقيام بذلك ، ستحتاج إلى استخدام 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')
    })

يفترض هذا المثال أن ملفاتك الثابتة في المجلد "ثابت" ، وتكيف مع كل ما يناسب بيئتك.

أنظف إجابة على هذا السؤال هو إجابه لهذا (متطابق) سؤال:

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:])

كي تختصر:

  • كما أشار ديفيد ، مع التكوين الصحيح هو طيب لخدمة بعض الملفات الثابتة من خلال Prod
  • البحث عن /robots.txt يجب ألا يؤدي إلى إعادة توجيه إلى /static/robots.txt. (في Seans الإجابة ، ليس من الواضح على الفور كيف يتم تحقيق ذلك.)
  • ليس من النظيف إضافة ملفات ثابتة إلى مجلد جذر التطبيق
  • أخيرًا ، يبدو الحل المقترح أكثر نظافة من نهج الإضافة الوسيطة:

على الرغم من أن هذا سؤال قديم تم إجراؤه ، إلا أنني أجيب على هذا لأن هذا المنشور يظهر مرتفعًا جدًا في نتائج Google. على الرغم من عدم تغطيتها في الوثائق ، إذا قرأت مستندات API بالنسبة إلى مُنشئ كائن تطبيق Flask يتم تغطيته. عن طريق تمرير المعلمة المسماة static_folder مثل ذلك:

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

... يمكنك تحديد من أين يتم تقديم الملفات الثابتة. وبالمثل ، يمكنك تحديد أ template_folder, ، اسمك static_url_path.

تقديم الملفات الثابتة لا علاقة لها بالتطبيق الذي يهدف إلى تقديم محتوى ديناميكي. تعتمد الطريقة الصحيحة لخدمة الملفات الثابتة على الخادم الذي تستخدمه. بعد كل شيء ، عندما تقوم بتشغيل التطبيق الخاص بك ، ستحتاج إلى ربطه بخادم ويب. لا يمكنني التحدث إلا عن Apache HTTPD ، وبالتالي يتم تعريف طريقة تقديم الملفات الثابتة في المضيف الظاهري الذي ترتبط بتطبيقك من خلال Mod-WSGI. فيما يلي الدليل الذي سيوضح لك كيفية تقديم خرائط sitems أو robots.txt أو أي محتوى ثابت:http://code.google.com/p/modwsgi/wiki/quickconfigurationguide#mounting_at_root_of_site

هناك طريقة أخرى لإرسال ملفات ثابتة وهي استخدام قاعدة كل مثل هذا:

@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/

علاوة على ذلك ، أنا أتطور باستخدام Flask على جهازك المستقل ولكن الانتشار مع Apache في خادم الإنتاج. أنا أستعمل:

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

ربما تم إضافة هذا منذ طرح هذا السؤال ، لكنني كنت أبحث من خلال "مساعدي Flask.py" ووجدت flask.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.
'''

... الذي يشير إلى flask.send_file:

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

... والتي تبدو أفضل لمزيد من التحكم ، على الرغم من أن send_from_directory يمر ** خيارات مباشرة إلى Send_File.

من الوثائق هنا: http://flask.pocoo.org/docs/quickstart/#static-files

تحتاج تطبيقات الويب الديناميكية إلى ملفات ثابتة أيضًا. هذا عادة ما تأتي ملفات CSS و JavaScript. من الناحية المثالية ، تم تكوين خادم الويب الخاص بك لخدمتهم من أجلك ، ولكن أثناء التطوير يمكن أن تفعل ذلك أيضًا. ما عليك سوى إنشاء مجلد يسمى Static في الحزمة الخاصة بك أو بجوار الوحدة النمطية وسيكون متاحًا على /ثابت على التطبيق.

لإنشاء عناوين URL لهذا الجزء من عنوان URL ، استخدم اسم عنوان URL "الثابت" الخاص:

url_for ('static' ، filename = 'style.css')

يجب تخزين الملف على نظام الملفات باعتباره ثابتًا/style.css.

أواجه نفس المعضلة أيضًا. هل بعض البحث ووجدت إجابتي (MHO):

قد أقتبس من الوثائق

تحتاج تطبيقات الويب الديناميكية إلى ملفات ثابتة أيضًا. هذا عادة ما تأتي ملفات CSS و JavaScript. من الناحية المثالية ، تم تكوين خادم الويب الخاص بك لخدمتهم من أجلك ، ولكن أثناء التطوير يمكن أن تفعل ذلك أيضًا. ما عليك سوى إنشاء مجلد يسمى Static في الحزمة الخاصة بك أو بجوار الوحدة النمطية وسيكون متاحًا على /ثابت على التطبيق.

IMHO: عندما يكون طلبك متروكًا إنتاج, ، يجب تكوين الملف الثابت (أو أنه مثالي) على خادم الويب (Nginx ، Apache) ؛ لكن أثناء تطوير, ، جعلت Flask أنها متاحة لتقديم الملفات الثابتة. هذا لمساعدتك على تطوير بسرعة - لا حاجة لإعداد خادمات الويب وما شابه.

أتمنى أن يساعد ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top