Ответ 1
Лучший способ - установить static_url_path на корневой URL
from flask import Flask
app = Flask(__name__, static_folder='static', static_url_path='')
Есть ли какое-нибудь умное решение для хранения статических файлов в корневом каталоге приложения 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, но для разработки приятно иметь вашу среду разработки, чтобы приложение 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", настраиваются на все, что подходит вашей среде.
Самый чистый ответ на этот вопрос - это ответ на этот (идентичный) 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:])
Подводя итог:
Несмотря на то, что это старый ответ на вопрос, я отвечаю на это, потому что этот пост очень высок в результатах 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
.
Обслуживание статических файлов не имеет ничего общего с приложением, предназначенным для доставки динамического содержимого. Правильный способ обслуживания статических файлов зависит от того, какой сервер вы используете. В конце концов, когда вы загружаете свое приложение, вам нужно привязать его к веб-серверу. Я могу говорить только для apache httpd, поэтому способ обслуживания статических файлов определяется на виртуальном хосте, который вы привязываете к своему приложению через mod-wsgi. Вот руководство, которое покажет вам, как обслуживать sitemaps, robots.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/
Кроме того, я разрабатываю флешку на своей автономной машине, но развертываю с 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", и я нашел файл 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 приходящий из. В идеале ваш веб-сервер настроен для обслуживания их для вас, но во время разработки Flask может делать это также. Просто создайте папку называется статическим в вашем пакете или в следующем к вашему модулю, и это будет доступный/статический на приложение.
Чтобы создать URL-адреса для этой части URL, используйте специальный "статический" URL-адрес Имя:
url_for ( 'статический', имя файла = 'style.css')
Файл должен быть сохранен на файловой системы как static/style.css.
У меня та же дилемма. Был ли поиск и найден мой ответ (MHO):
Можно также указать цитату из документации
Для динамических веб-приложений также требуются статические файлы. Обычно используется CSS и JavaScript файлы. В идеале ваш веб-сервер настроен для обслуживания их для вас, но во время разработки Flask также может сделать это. Просто создайте папку с именем static в своем пакете или рядом с вашим модулем, и она будет доступна в /static в приложении.
ИМХО: если ваше приложение занято производством, статическая служба файлов должна быть (или идеально) настроена на веб-сервере (nginx, apache); но во время разработки, Flask предоставила ему доступ к статическим файлам. Это поможет вам быстро развиваться - нет необходимости настраивать веб-серверы и т.д.
Надеюсь, что это поможет.