Статические файлы в колбе-роботе.txt, Карта сайта.xml (mod wsgi)



есть ли какое-либо умное решение для хранения статических файлов в корневом каталоге приложения Flask.
микророботы.txt и карта сайта.xml, как ожидается, будет найден в/, Поэтому моя идея заключалась в создании маршрутов для них:



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


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

909   9  

9 ответов:

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

from flask import Flask

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

@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", настраиваются на что угодно подходит для вашего окружения.

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

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

хотя это старый ответ на вопрос, я отвечаю на это, потому что этот пост появляется довольно высоко в результатах Google. Хотя это не описано в документации, если Вы читаете API docs для конструктора объекта приложения колбы он покрыт. Путем передачи именованного параметра 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. Вот руководство, которое покажет вам, как служить карты местности, роботы.txt или любой статический контент: http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Mounting_At_Root_Of_Site

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

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

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

... который ссылается на колбу.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_for ('static', стиль именем='.css')

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

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

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

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

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

надеюсь, что это помогает.

Comments

    Ничего не найдено.