Bottle is a neat little microframework for Python that’s all about keeping it simple. If you’re getting into web development or just need something lightweight for quick projects, Bottle should be on your radar. It’s perfect for building small web apps or getting those rapid prototypes off the ground without much fuss.
To kick things off with Bottle, you first need to get it installed. No worries here, it’s just a pip install away. Head to your terminal, punch in:
pip install bottle
Boom. Bottle is now snug in your Python environment. Next up, let’s make sure it’s all working with a classic “Hello World” app. This’ll give you a first taste of how straightforward Bottle can be.
Here’s some code for your app.py
file:
from bottle import route, run
@route('/hello/<name>')
def index(name):
return f'Hello {name}'
run(host='localhost', port=8080)
Save it and run the script:
python app.py
Open your browser and navigate to http://localhost:8080/hello/yourname
and voila, a friendly greeting just for you!
Now, if things are getting a bit more complicated and you’re dealing with multiple dependencies, it’s a good idea to set up a virtual environment. This keeps all your project-specific dependencies nicely tucked away.
Here’s the drill:
Create your project directory:
mkdir myproject && cd myproject
Set up a virtual environment:
pip install virtualenv
virtualenv venv
source venv/bin/activate # On Windows, it's venv\Scripts\activate
With the virtual environment activated, install Bottle:
pip install bottle
pip freeze > requirements.txt # Save your dependencies
You’re now ready to rock some more ambitious projects.
Routing is one of the core features of Bottle, and it keeps it dead simple with the @route
decorator. For example, here’s how you set up a couple of routes:
from bottle import route, run, template
index_html = '''My first web app By <strong>{{ author }}</strong>.'''
@route('/')
def index():
return template(index_html, author='Your Name')
@route('/name/<name>')
def name(name):
return template(index_html, author=name)
if __name__ == '__main__':
run(host='localhost', port=8080, debug=True)
The @route
decorator binds the index
function to the root URL (/
) and the name
function to a dynamic URL (/name/<name>
). The template
function is used to render HTML templates, with variables passed to them. It’s stupidly simple and super effective.
Speaking of templates, Bottle’s got a built-in engine, but it plays nice with other popular ones like Jinja2, Mako, and Cheetah. If you want to keep it simple and stick with Bottle’s built-in engine, here’s a neat example:
from bottle import route, run, template
@route('/hello/<name>')
def index(name):
return template('<b>Hello {{name}}</b>!', name=name)
run(host='localhost', port=8080)
For more complex templates, just whip up your HTML files and pop them in a templates
directory. You can then render them easily like so:
from bottle import route, run, template
@route('/')
def index():
return template('index.html', author='Your Name')
run(host='localhost', port=8080)
Handling forms and user input is a breeze with Bottle. Here’s a little snippet showing how easy it is to capture and work with form data:
from bottle import route, run, request
@route('/form', method='POST')
def form():
name = request.forms.get('name')
return f'Hello {name}'
run(host='localhost', port=8080)
Not only does Bottle come with its own built-in HTTP server for development, but it also plays well with other WSGI-capable servers like Paste, Bjoern, and more. So, you’ve got options.
Let’s put all this together into a simple web app that takes a user’s name and greets them. Here’s the full code for a basic greeting app:
from bottle import route, run, template, request
# Simple HTML template for the form
index_html = '''<form action="/greet" method="post">
<input type="text" name="name" placeholder="Enter your name">
<input type="submit" value="Submit">
</form>'''
greet_html = '''<h1>Hello {{name}}!</h1>'''
@route('/')
def index():
return template(index_html)
@route('/greet', method='POST')
def greet():
name = request.forms.get('name')
return template(greet_html, name=name)
if __name__ == '__main__':
run(host='localhost', port=8080, debug=True)
This mini web app has just two routes: one for the homepage with a form and another to handle the form submission and display the greeting. Simple, functional, and easy to extend.
Bottle’s got a lot going for it—it’s versatile, extremely lightweight, and straightforward to use, making it perfect for small projects or rapid prototyping. Whether you’re a Python newbie or a seasoned developer, Bottle has the tools and simplicity to help you get up and running quickly. So why not give it a whirl for your next project? You might just find it’s exactly what you need.