I had a little trouble getting started with Bottle. The main thing was that I had trouble accessing my own Javascript in Bottle’s BasicTemplates. The trick was to do two things:
- Allow templates to access the “get_url” function
- Create an endpoint to serve your own static pages yourself
Here is my file structure:
simple-server venv ... static js handlers.js templates base.tpl index.tpl app.py
First, app.py is simple. Line 9 defines a route for static files, line 14 is my main page, and line 19 provides some data that we will serve dynamically on the main page.
# app.py import bottle from bottle import run, template, static_file app = bottle.default_app() bottle.BaseTemplate.defaults['get_url'] = app.get_url @app.route('/static/:path#.+#', name='static') def static(path): return static_file(path, root='static') @app.route('/') def index(): return template('templates/index.tpl') @app.get('/data') def get_vin(): return 'DEADBEEFDEADBEEF' run(host='localhost', port=8080)
The base template imports bootstrap, jquery, and my own javascript.
<!DOCTYPE html> <html> <head> <title> {{title or 'No Title'}} </title> <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB" crossorigin="anonymous"> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.bundle.min.js" integrity="sha384-u/bQvRA/1bobcXlcEYpsEdFVK/vJs3+T+nXLsBYJthmdBuavHvAW6UsmqO2Gd/F9" crossorigin="anonymous"></script> <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script> <script type="text/javascript" src="{{ get_url('static', path='js/handlers.js') }}" charset="utf-8"></script> </head> <body> {{!base}} </body> </html>
The index template, which inherits from the base template is pretty simple. I have an empty div tag where some data will go when the page loads, and a button.
%rebase('templates/base.tpl', title='Index') <p>Hallo</p> <div id="data"></div> <button class="btn btn-default" id="first-btn">Click</button>
Finally, handlers.js hits our /data endpoint when the page loads, and provides some behavior (an alert) when we click a button on the page.
$(document).ready(function() { $.get('/data', function(data, status) { $('#data').append("Data: "+data) }) $('#first-btn').click(function(){ alert("Hallo"); }); });