Вопрос

Есть ли удивительное решение для хранения статических файлов в корневом каталоге приложения 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. (В сеанском ответе не сразу понятно, как это достигнуто.)
  • Не стоит добавлять статические файлы в корневую папку приложения
  • Наконец, предлагаемое решение выглядит очень чище, чем добавление промежуточного программного обеспечения:

Несмотря на то, что это старый ответ, я отвечаю на это, потому что этот пост подходит довольно высоко в результатах Google. Пока он не покрыт документацией, если вы читаете Документы 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.

Обслуживание статических файлов не имеет ничего общего с приложением, которое предназначено для доставки динамического контента. Правильный способ порции статических файлов зависит от того, какой сервер вы используете. В конце концов, когда вы получите приложение вверх и запуском, вам нужно будет связать это на веб-сервере. Я могу говорить только для Apache HTTPD, поэтому способа обслуживания статических файлов определяется на виртуальном хосте, который вы обязательны с вашим приложением через Mod-WSGI. Вот руководство, которое покажет вам, как обслуживать Sitemaps, 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/

Кроме того, я разрабатываю с помощью колбы на моем автономном компьютере, но развертываю с 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()

Это могло быть добавлено, поскольку этот вопрос был задан, но я смотрел через колбу «HEMPERS.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. В идеале ваш веб-сервер настроен для обслуживания для вас для вас, но во время колбы для разработки также может сделать это. Просто создайте папку, называемую статическими в вашей упаковке или рядом с вашим модулем, и она будет доступна в / статическом на приложении.

Чтобы генерировать URL-адреса к той части URL, используйте специальное имя «статического» URL-адреса:

URL_FOL ('Static', filename = 'style.csss')

Файл должен быть сохранен на файловой системе в качестве статического / стиля.css.

У меня тоже такая же дилемма. Поиграл и нашел свой ответ (MHO):

Может также цитировать из документации

Динамические веб-приложения нуждаются в статических файлах. Это обычно там, откуда файлы CSS и JavaScript. В идеале ваш веб-сервер настроен для обслуживания для них для вас, но во время колбы для разработки также может сделать это. Отказ Просто создайте папку, называемую статическими в вашей упаковке или рядом с вашим модулем, и она будет доступна в / статическом на приложении.

Imho: когда ваше приложение подходит для производство, статическое служение файлов должно быть (или идеально) настроен на веб-сервере (Nginx, Apache); но во время разработка, Колба сделала его доступным для обслуживания статических файлов. Это поможет вам быстро развиваться - нет необходимости настроить веб-серверы и такие.

Надеюсь, поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top