Статические файлы в Flask - robot.txt, sitemap.xml (mod_wsgi) - PullRequest
89 голосов
/ 21 ноября 2010

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

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

Ответы [ 9 ]

71 голосов
/ 12 июня 2013

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

.
from flask import Flask

app = Flask(__name__, static_folder='static', static_url_path='')
65 голосов
/ 10 февраля 2011

@ 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')
    })

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

56 голосов
/ 31 января 2013

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

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

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

15 голосов
/ 22 ноября 2010

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

13 голосов
/ 26 октября 2012

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

@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()
6 голосов
/ 23 июля 2011

Возможно, это было добавлено после того, как был задан этот вопрос, но я просматривал «helpers.py» фляги и обнаружил директорию flask.send_from_dory:

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.

3 голосов
/ 24 марта 2011

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

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

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

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

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

0 голосов
/ 18 сентября 2011

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

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

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

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

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

...