Как загрузить файл JavaScript или CSS в шаблон BottlePy? - PullRequest
13 голосов
/ 08 августа 2011

Я пытаюсь вернуть HTML-шаблон с BottlePy.И это прекрасно работает.Но если я вставлю такой файл javascript в свой tpl-файл:

<script type="text/javascript" src="js/main.js" charset="utf-8"></script>

, я получу ошибку 404. (Не удалось загрузить ресурс: сервер ответил с состоянием 404 (не найдено))

Кто-нибудь знает, как решить эту проблему?

Вот мой скриптfile:

from bottle import route, run, view

@route('/')
@view('index')
def index():
    return dict()
run(host='localhost', port=8080)

И это файл шаблона, расположенный в подпапке "./views".

<!DOCTYPE html>
<html lang="de">
    <head>
        <meta charset="utf-8" />
        <script type="text/javascript" src="js/main.js" charset="utf-8"></script>
    </head>
    <body>
    </body>
</html>

Может быть, это "rootPath / js / main.js" изсервер разработки, где он ищет мой js-файл?

Структура файлов:

app.py
-js
 main.js
-views
 index.tpl

Спасибо.

Ответы [ 3 ]

28 голосов
/ 08 августа 2011

Ну, во-первых, вам нужен ваш dev-сервер для фактического обслуживания main.js, иначе он не будет доступен для браузера.

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

  app.py
- static/
    main.js
- views/
    index.tpl

Ни в коем случае это точное наименование и макет не требуется, только часто используется.

Далее,Вы должны предоставить обработчик для статических файлов:

from bottle import static_file

# ...

@route('/static/:path#.+#', name='static')
def static(path):
    return static_file(path, root='static')

Это будет отображать ваши файлы в браузере под static/.

Теперь, до последней вещи.Вы указали свой JavaScript как:

<script type="text/javascript" src="js/main.js" charset="utf-8"></script>

Это означает, что путь к .js равен относительно текущей страницы.На вашем сервере разработки страница индекса (/) будет искать .js в /js/main.js, а другая страница (скажем, /post/12) будет искать ее в /post/12/js/main.js, и она обязательно завершится с ошибкой.

Вместо этого вам нужно использовать функцию get_url для правильной ссылки на статические файлы.Ваш обработчик должен выглядеть следующим образом:

from Bottle import get_url

# ...

@route('/')
@view('index')
def index():
    return { 'get_url': get_url } 

А в index.tpl на .js следует ссылаться как:

<script type="text/javascript" src="{{ get_url('static', path='main.js') }}" charset="utf-8"></script>

get_url находит обработчик с name='static',и вычисляет правильный путь к нему.Для сервера dev это всегда будет /static/.Вы, вероятно, даже можете жестко закодировать его в шаблоне, но я не рекомендую его по двум причинам:

  • Вы не сможете монтировать ваше приложение где-либо, кроме как под root, в рабочей среде;то есть, когда вы загружаете его на сервер переноса, его можно поместить в http://example.com/ (root), но не в http://example.com/myapp/.
  • Если вы измените местоположение /static/ dir, вы 'Вам придется искать его по всем вашим шаблонам и изменять его в каждом шаблоне.
0 голосов
/ 18 августа 2017

Вот рабочий подход добавления статических файлов, таких как CSS / JS, в Bottle веб-проект.Я использую Bootstrap и Python 3.6.

Структура проекта

project
│   app.py
│   bottle.py
│
├───static
│   └───asset
│       ├───css
│       │       bootstrap-theme.css
│       │       bootstrap-theme.css.map
│       │       bootstrap-theme.min.css
│       │       bootstrap-theme.min.css.map
│       │       bootstrap.css
│       │       bootstrap.css.map
│       │       bootstrap.min.css
│       │       bootstrap.min.css.map
│       │       custom.css
│       │
│       ├───fonts
│       │       glyphicons-halflings-regular.eot
│       │       glyphicons-halflings-regular.svg
│       │       glyphicons-halflings-regular.ttf
│       │       glyphicons-halflings-regular.woff
│       │       glyphicons-halflings-regular.woff2
│       │
│       └───js
│               bootstrap.js
│               bootstrap.min.js
│               jquery.min.js
│               npm.js
│
└───views
        index.tpl

app.py

from bottle import Bottle, run, \
     template, debug, static_file

import os, sys

dirname = os.path.dirname(sys.argv[0])

app = Bottle()
debug(True)

@app.route('/static/<filename:re:.*\.css>')
def send_css(filename):
    return static_file(filename, root=dirname+'/static/asset/css')

@app.route('/static/<filename:re:.*\.js>')
def send_js(filename):
    return static_file(filename, root=dirname+'/static/asset/js')

@app.route('/')
def index():
    data = {"developer_name":"Ahmedur Rahman Shovon",
            "developer_organization":"Datamate Web Solutions"}
    return template('index', data = data)

run(app, host='localhost', port = 8080)

index.tpl

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="Bottle web project template">
    <meta name="author" content="datamate">
    <link rel="icon" href="/static/favicon.ico">        
    <title>Project</title>
    <link rel="stylesheet" type="text/css" href="/static/bootstrap.min.css">
    <script type="text/javascript" src="/static/jquery.min.js"></script>
    <script type="text/javascript" src="/static/bootstrap.min.js"></script> 
</head>
<body>
    <!-- Static navbar -->
    <nav class="navbar navbar-default navbar-static-top">
        <div class="container">
            <div class="row">
                <div class="navbar-header">
                    <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                        <span class="sr-only">Toggle navigation</span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                    </button>
                    <a class="navbar-brand" href="#">Project</a>
                </div>
                <div id="navbar" class="navbar-collapse collapse">
                    <ul class="nav navbar-nav navbar-right">
                        <li><a href="../navbar/">Home</a></li>
                        <li><a href="./">Github</a></li>
                        <li><a href="../navbar-fixed-top/">Stackoverflow</a></li>
                    </ul>
                </div><!--/.nav-collapse -->
            </div>
        </div>
    </nav>
    <div class="container">
        <div class="row">
            <div class="jumbotron">
            <h2>Welcome from {{data["developer_name"]}}</h2>
                <p>This is a template showcasing the optional theme stylesheet included in Bootstrap. Use it as a starting point to create something more unique by building on or modifying it.</p>
            </div>
        </div>
        <!--./row-->
        <div class="row">
            <hr>
            <footer>
                <p>&copy; 2017 {{data["developer_organization"]}}.</p>
            </footer>           
        </div>
    </div> 
    <!-- /container -->
</body>
</html>

Выход

bottle bootstrap demo

0 голосов
/ 08 августа 2011

Я думаю, вы помещаете файл main.js в неправильное место.

Обратите внимание, что этот путь к файлу должен быть относительно запрошенного URL, а не относительно пути к вашему шаблону. Поэтому поместить его в папку типа template/js/main.js не получится.

...