Вопрос по python, python-2.7 – Бутылка Статические файлы

24

Я пытался читать документы по бутылке, но до сих пор не уверен, как работает статическая подача файлов. У меня естьindex.tpl файл, и внутри него к нему прикреплен файл CSS, и он работает. Однако я читал, что Bottle автоматически не обслуживает CSS-файлы, что не может быть правдой, если страница загружается правильно.

У меня, однако, возникают проблемы со скоростью при запросе страницы. Это потому, что я не использовалreturn static_file(params go here)? Если бы кто-то мог разобраться, как они работают и как они используются при загрузке страницы, это было бы здорово.

Код сервера:

<code>from Bottle import route,run,template,request,static_file



@route('/')
def home():
    return template('Templates/index',name=request.environ.get('REMOTE_ADDR'))

run(host='Work-PC',port=9999,debug=True)
</code>

Показатель

<code><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta http-equiv="content-type"
 content="text/html; charset=ISO-8859-1">
  <title>index</title>
  <link type="text/css"
 href="cssfiles/mainpagecss.css"
 rel="stylesheet">
</head>
<body>
<table
 style="width: 100%; text-align: left; margin-left: auto; margin-right: auto;"
 border="0" cellpadding="2" cellspacing="2">
  <tbody>
    <tr>
      <td>
      <h1><span class="headertext">
      <center>Network
Website</center>
      </span></h1>
      </td>
    </tr>
  </tbody>
</table>
%if name!='none':
    <p align="right">signed in as: {{name}}</p>
%else:
    pass
%end
<br>
<table style="text-align: left; width: 100%;" border="0" cellpadding="2"
 cellspacing="2">
  <tbody>
    <tr>
      <td>
      <table style="text-align: left; width: 100%;" border="0"
 cellpadding="2" cellspacing="2">
        <tbody>
          <tr>
            <td style="width: 15%; vertical-align: top;">
            <table style="text-align: left; width: 100%;" border="1"
 cellpadding="2" cellspacing="2">
              <tbody>
                <tr>
                  <td>Home<br>
                  <span class="important">Teamspeak Download</span><br>
                  <span class="important">Teamspeak Information</span></td>
                </tr>
              </tbody>
            </table>
            </td>
            <td style="vertical-align: top;">
            <table style="text-align: left; width: 100%;" border="1"
 cellpadding="2" cellspacing="2">
              <tbody>
                <tr>
                  <td>
                  <h1><span style="font-weight: bold;">Network Website</span></h1>
To find all of the needed information relating to the network's social
capabilities, please refer to the links in the side bar.</td>
                </tr>
              </tbody>
            </table>
            </td>
          </tr>
        </tbody>
      </table>
      </td>
    </tr>
  </tbody>
</table>
</body>
</html>
</code>
Я мало знаю о бутылке, но заявление о том, что она не обслуживает статические файлы, может относиться только к производственному режиму, а не к разработке. Обычно гораздо эффективнее позволить вашему Apache или тому, что вы используете, обслуживать статические файлы. И, между прочим ... у вас слишком много таблиц в вашем HTML;) pcalcao

Ваш Ответ

5   ответов
3

вы должны обслуживать статические файлы, используя Статические function и css - это статический файл. Статическая функция обрабатывает безопасность и некоторые другие функции, которые вы можете узнать из источника.путргумент @ для статической функции должен указывать на каталог, где вы храните @ C файлы

Так как мне настроить его для работы с моим шаблоном? Или это только при развертывании на рабочем сервере, а не у разработчика. сервер? IT Ninja
Bottle имеет переменную с именем Template_path, который представляет собой список путей, которые Бутылка ищет для шаблонов. Проверьте строку 2839 в исходном файле bottle.py. Вы либо используете один из путей по умолчанию, либо можете добавить путь, который вы используете, в этот список. cobie
Так что, если я добавлю свой путь к шаблону к этой переменной, то используйтеreturn static_file(pathtomycss) вот как я должен это сделать? Если нет, не могли бы вы привести пример? Прошу прощения за все эти вопросы, я только начинаю в веб-разработке x.x IT Ninja
Нет .. ты можешь добавить путь к своемуhtml шаблон файлы к пути шаблона, но файлы css обычно включаются в другую папку. Вы передаете путь к этой папке в функцию static_file. cobie
так у меня есть две функции возврата? шаблон и статический файл? IT Ninja
70

Для обслуживания статических файлов с помощьюbottle вам нужно использовать предоставленныйstatic_file функцию и добавить несколько дополнительных маршрутов. Следующие маршруты направляют запросы статических файлов и обеспечивают доступ только к файлам с правильным расширением.

from bottle import get, static_file

# Static Routes
@get("/static/css/<filepath:re:.*\.css>")
def css(filepath):
    return static_file(filepath, root="static/css")

@get("/static/font/<filepath:re:.*\.(eot|otf|svg|ttf|woff|woff2?)>")
def font(filepath):
    return static_file(filepath, root="static/font")

@get("/static/img/<filepath:re:.*\.(jpg|png|gif|ico|svg)>")
def img(filepath):
    return static_file(filepath, root="static/img")

@get("/static/js/<filepath:re:.*\.js>")
def js(filepath):
    return static_file(filepath, root="static/js")

Теперь в html вы можете ссылаться на файл следующим образом:

<link type="text/css" href="/static/css/main.css" rel="stylesheet">

Макет каталога:

`--static
|  `--css
|  `--fonts
|  `--img
|  `--js
Как называется твой модуль, который содержит# Static Routes, а где он находится в каталоге вашего проекта? Droogans
У меня естьserver.py файл в корне каталога моего проекта, который запускает сервер и содержит статические маршруты, а статический каталог также находится просто в корне каталога проекта. Sanketh Katta
use<:re:.*/><filename:re:.*\.js>и чтоsome/path/some.js а такжеsome.js работае peko
@ SankethKatta есть повторяющийся тип, дополнительная закрывающая скобка: возвращать static_file (filepath, root = "static / img") здесь >>) << здесь Ehouarn Perret
11

потому что многие мои студенты использовали этот код в задании, и у меня есть некоторые опасения по поводу решения.

Стандартный способ подачи статических файлов в Bottle - этодокументаци:

from bottle import static_file
@route('/static/<filepath:path>')
def server_static(filepath):
    return static_file(filepath, root='/path/to/your/static/files')

таким образом, все файлы ниже вашей статической папки обслуживаются с URL, начинающегося с / static. В HTML-коде вам необходимо указать полный URL-адрес ресурса, например:

<link rel='stylesheet' type='text/css' href='/static/css/style.css'>

Ответ от Sanketh делает так, что любая ссылка на изображение, файл CSS и т. Д. В любом месте в пространстве URL подается из заданной папки внутри статической папки. Таким образом, /foo/bar/baz/picture.jpg и /picture.jpg будут обслуживаться из static / images / picture.jpg. Это означает, что вам не нужно беспокоиться о том, чтобы правильно указать путь в своем HTML-коде, и вы всегда можете использовать относительные имена файлов (т.е. просто src = "picture.jpg").

Проблема этого подхода возникает при попытке развернуть приложение. В производственной среде вы хотите, чтобы статические ресурсы обслуживались веб-сервером, таким как nginx, а не вашим приложением Bottle. Для этого все они должны обслуживаться из одной части пространства URL, например. / Статический. Если ваш код изобилует относительными именами файлов, он не будет легко переведен в эту модель.

Итак, я бы посоветовал использовать трехстрочное решение из учебника по бутылкам, а не более сложное решение, перечисленное на этой странице. Это более простой код (поэтому он менее подвержен ошибкам) и позволяет беспрепятственно переходить в производственную среду без изменений кода.

Я написал свой первоначальный ответ несколько лет назад, и мой проект в то время сделал более приятным ссылаться на файлы, как я делал для своего варианта использования. Я обновил ответ, чтобы он больше соответствовал учебному пособию и хорошо играл с производственным развертыванием. Однако я оставил в отдельных маршрутах для каждого типа файлов дополнительную проверку разрешенных расширений файлов в каждой папке. Sanketh Katta
3

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

<script src="{{ get_url('static', filename='js/bootstrap.min.js') }}"></script>

Вы можете сделать это, просто заменив<filename> в статическом декораторе маршрута с типом:path - вот так

@app.route('/static/<filename:path>', name='static')
def serve_static(filename):
    return static_file(filename, root=config.STATIC_PATH)

The:path сопоставляет полный путь к файлу не жадным способом, поэтому вам не нужно беспокоиться об изменении шаблонов при переходе на рабочий процесс - просто держите все в той же относительной структуре папок.

Заметка В этом примере я используюget_url в моем шаблоне, но вы также можете легко указать ссылку вручную -/static/js/bootstrap.min.js. Aaron D
1

но со временем сконцентрировал его на функции расширения агностиков. Вам просто нужно добавить сопоставления папок расширений в словарь ext_map. По умолчанию используется static / folder, если расширение не отображается явно.

import os.path    

# Static Routes
@get('/<filename>')
def serve_static_file(filename):
    ext = os.path.splitext(filename)[1][1:]
    ext_map = {'image':['png','gif','jpg','ico'],'js':['js']}
    sub_folder = next((k for k, v in ext_map.items() if ext in v),'')
    return static_file(filename, root='static/'+sub_folder)

Похожие вопросы