Статические файлы в Flask - robot.txt, sitemap.xml(mod_wsgi)

Есть ли какое-нибудь умное решение для хранения статических файлов в корневом каталоге приложения 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

Должно быть что-то более удобное:)

Ответ 1

Лучший способ - установить static_url_path на корневой URL

from flask import Flask

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

Ответ 2

@vonPetrushev прав, в производстве вы хотите обслуживать статические файлы через nginx или apache, но для разработки приятно иметь вашу среду разработки, чтобы приложение 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')
    })

В этом примере предполагается, что ваши статические файлы находятся в папке "static", настраиваются на все, что подходит вашей среде.

Ответ 3

Самый чистый ответ на этот вопрос - это ответ на этот (идентичный) question:

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

Подводя итог:

  • как указал Дэвид, с правильной конфигурацией ok, чтобы обслуживать несколько статических файлов через prod
  • поиск /robots.txt не должен приводить к перенаправлению в /static/robots.txt. (В Шонах ответ на него не сразу ясно, как это достигнуто.)
  • Не очищать, чтобы добавить статические файлы в корневую папку приложения
  • наконец, предлагаемое решение выглядит намного чище, чем добавление подхода промежуточного программного обеспечения:

Ответ 4

Несмотря на то, что это старый ответ на вопрос, я отвечаю на это, потому что этот пост очень высок в результатах Google. Хотя это не описано в документации, если вы читаете документы API для созданного объекта объекта Flask Application, который он охватывает. Передавая именованный параметр static_folder следующим образом:

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

... вы можете определить, от каких статических файлов. Аналогично, вы можете определить template_folder, имя вашего static_url_path.

Ответ 5

Обслуживание статических файлов не имеет ничего общего с приложением, предназначенным для доставки динамического содержимого. Правильный способ обслуживания статических файлов зависит от того, какой сервер вы используете. В конце концов, когда вы загружаете свое приложение, вам нужно привязать его к веб-серверу. Я могу говорить только для apache httpd, поэтому способ обслуживания статических файлов определяется на виртуальном хосте, который вы привязываете к своему приложению через mod-wsgi. Вот руководство, которое покажет вам, как обслуживать sitemaps, robots.txt или любой статический контент: http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Mounting_At_Root_Of_Site

Ответ 6

Другой способ отправки статических файлов - использовать правило catch-all, подобное этому:

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

Ответ 7

Возможно, это было добавлено, так как этот вопрос задавали, но я просматривал флягу "helpers.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.

Ответ 8

Из документации здесь: http://flask.pocoo.org/docs/quickstart/#static-files

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

Чтобы создать URL-адреса для этой части URL, используйте специальный "статический" URL-адрес Имя:

url_for ( 'статический', имя файла = 'style.css')

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

Ответ 9

У меня та же дилемма. Был ли поиск и найден мой ответ (MHO):

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

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

ИМХО: если ваше приложение занято производством, статическая служба файлов должна быть (или идеально) настроена на веб-сервере (nginx, apache); но во время разработки, Flask предоставила ему доступ к статическим файлам. Это поможет вам быстро развиваться - нет необходимости настраивать веб-серверы и т.д.

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