Of course! Let's break down Python Paste Deploy. It's a fundamental concept in the Python web ecosystem, especially for applications built on frameworks like Pyramid and Pylons.

What is Paste Deploy?
In simple terms, Paste Deploy is a system for configuring and running Python web applications.
Think of it as a standardized "plug-and-play" mechanism for your web app. It separates your application's code from its configuration and deployment environment. This allows you to run the same Python code in different ways (e.g., on a local development server, a production WSGI server, or a cloud service) just by changing a configuration file.
The Core Problem It Solves
Before Paste Deploy, deploying a Python web app was often messy. You'd have to write different scripts or settings for:
- Local development (maybe using the built-in server).
- Production (using a server like Gunicorn or uWSGI).
- Testing (running in a special test environment).
This led to a lot of duplicated code and "it works on my machine" problems.

Paste Deploy solves this by introducing a common interface: the .ini configuration file. This file tells the deployment system how to load and run your application, regardless of the underlying server.
Key Concepts
To understand Paste Deploy, you need to know three main things:
The .ini Configuration File
This is the heart of Paste Deploy. It's a simple text file that defines your application's deployment.
A typical production.ini file looks like this:

# [app:main] defines the application section
[app:main]
# Use the 'egg' entry point to find the application.
# This is the most common way.
paste.app_factory = myproject:main
# [server:main] defines the server section
[server:main]
use = egg:waitress#main
listen = 0.0.0.0:8080
# [composite:main] is used to combine applications or middleware
[composite:main]
use = egg:Paste#urlmap
/ = myapp
# [pipeline:main] is used to wrap the application in middleware
[pipeline:main]
pipeline =
egg:Paste#urlmap
/ = myapp
egg:Authentication#app
egg:Gzip#app
Let's break down the key sections:
-
[app:main]: This section defines your actual WSGI application.paste.app_factory = myproject:main: This is the most important line. It tells Paste Deploy:paste.app_factory: "I am defining an application factory."myproject:main: "Look for a Python module namedmyprojectand inside it, find an object namedmain. This object should be a function that creates a WSGI application." This function is the "application factory."
-
[server:main]: This section defines the WSGI server that will run your application.use = egg:waitress#main: "Use themainentry point from thewaitressegg (package)."listen = 0.0.0.0:8080: "Tell the server to listen on all network interfaces (0.0.0) at port8080."
-
[pipeline:main]: This is crucial for modern web apps. A pipeline is a stack of "middleware" that wraps your application. Middleware are components that process requests and responses as they pass through. For example, you can add middleware for authentication, logging, or compression.
The Application Factory
This is a Python function that Paste Deploy calls to create your WSGI application. It must:
- Accept a single argument, typically
global_config(a dictionary of the key-value pairs from the[app:main]section). - Return a WSGI application object (a callable that accepts
environandstart_response).
Here's a simple example for a Pyramid app in myproject/__init__.py:
# myproject/__init__.py
from pyramid.config import Configurator
from pyramid.response import Response
def main(global_config, **settings):
"""
This function returns a Pyramid WSGI application.
"""
config = Configurator(settings=settings)
# Add a simple route
config.add_route('home', '/')
config.add_view(lambda request: Response("Hello from Paste Deploy!"),
route_name='home')
return config.make_wsgi_app()
The Deployment Command
You use a command-line tool, often pserve, to start your application using the .ini file.
pserve is part of the PasteDeploy package. If you don't have it, install it:
pip install PasteDeploy
To run your application:
pserve production.ini
This command reads production.ini, finds the [server:main] section, starts the Waitress server, and then uses the [app:main] section to load your application.
A Complete, Practical Example
Let's build a minimal, runnable example.
Project Structure
my_paste_project/
├── myapp/
│ ├── __init__.py
│ └── views.py
├── setup.py
└── development.ini
The Code
myapp/__init__.py
This file will contain our application factory.
# myapp/__init__.py
from pyramid.config import Configurator
from pyramid.response import Response
def app_factory(global_config, **settings):
"""
A Pyramid application factory.
"""
config = Configurator(settings=settings)
config.include('myapp.views')
return config.make_wsgi_app()
myapp/views.py
This contains our actual view logic.
# myapp/views.py
from pyramid.response import Response
def hello_world(request):
return Response("Hello, world from a Paste Deploy app!")
setup.py
This file makes our application installable and tells pserve how to find it.
# setup.py
from setuptools import setup
setup(
name='myapp',
version='0.1',
description='A simple Paste Deploy example',
packages=['myapp'],
# This is the magic line!
# It tells Paste Deploy where to find the app factory.
entry_points={
'paste.app_factory': [
'main = myapp:app_factory',
],
},
)
development.ini
Our configuration file for local development.
# [app:main] section [app:main] # This key MUST match the 'main' in our entry_points definition use = egg:myapp # [server:main] section [server:main] use = egg:waitress#main listen = localhost:6543 # [loggers] section for basic logging [loggers] keys = root [handlers] keys = console [formatters] keys = generic [logger_root] level = INFO handlers = console [handler_console] class = StreamHandler args = (sys.stderr,) level = NOTSET formatter = generic [formatter_generic] format = %(levelname)-5.5s [%(name)s] %(message)s datefmt = %H:%M:%S
Run It!
-
Install dependencies:
pip install pyramid waitress PasteDeploy
-
Install your app:
# This makes the 'myapp' package and its entry points available pip install -e .
-
Start the server:
pserve development.ini
-
Visit the URL: Open your browser and go to
http://localhost:6543. You should see: "Hello, world from a Paste Deploy app!"
Modern Relevance and Alternatives
Is Paste Deploy still relevant?
- Yes, for Pyramid: Paste Deploy is still the standard and idiomatic way to deploy Pyramid applications. The Pyramid documentation and community tools are built around it.
- Less so for Flask/Django: These frameworks have their own built-in, simpler server runners (
flask run,manage.py runserver). They don't rely on the full.inifile system.
Alternatives to the .ini file:
The concept of a standardized deployment interface is so useful that it has evolved. Modern alternatives often use .ini files under the hood but provide a different interface:
- Plaster: This is a modern successor to Paste Deploy's configuration loading. It's a library that can read configuration from various sources (
.inifiles, JSON dictionaries, etc.). Pyramid now uses Plaster as its configuration loader. It's more flexible. [tool:pytest]inpyproject.toml: The Python community is moving towardspyproject.tomlfor project configuration. Tools likepytestandnoxuse sections within this file for their configuration. While not a direct WSGI deployment tool, it represents the same idea: standardizing configuration in a single file.
Summary
| Concept | Description |
|---|---|
| What it is | A system for configuring and running Python WSGI applications using .ini files. |
| Core Idea | Separate application code from deployment configuration. |
| Key File | .ini file (e.g., production.ini, development.ini). |
| Key Component | Application Factory: A Python function that creates the WSGI app. |
| Key Command | pserve: The command-line tool to start the app using the .ini file. |
| Main Use Case | The standard deployment mechanism for the Pyramid web framework. |
| Benefit | Allows the same code to be run in different environments (dev, staging, prod) with minimal changes. |
