.. _deployment: Deployment -- How to Use `pail` =============================== `pail` provides a `WSGI`_ middleware component .. code-block:: python from pail.wsgi import ImageAdaptingMiddleware that does all the work. It requires a list of supported `resolutions` (string with a comma-separated list of integers like ``"480, 922, 1322"``). Also a factory for this middleware is available: .. code-block:: python from pail.wsgi import filter_app that returns instances of the middleware. See the :ref:`api` for details. With `Paste`_ ------------- `pail` provides a `Paste`_-compatible `WSGI`_ filter app named ``main`` (this means that `Paste`_, once `pail` is installed, can find the middleware as ``egg:pail`` automatically). It is meant to be used as a `WSGI`_ application wrapper (a 'filter app' in `Paste`_ terms), so that incoming requests are parsed, then passed to the wrapped application and the result is scanned for image data before it is passed on to the client. A simple `Paste`_ config that makes use of `pail` might look like this: .. code-block:: ini [server:main] use = egg:Paste#http host = 0.0.0.0 port = 8000 [filter-app:main] use = egg:pail resolutions = 1024, 480 next = static [app:static] use = egg:Paste#static document_root = %(here)s/static-dir/ Here the first section ``[server:main]`` defines a server listening on port 8000. The ``[app:static]`` section tells where the real content comes from: it's simple static content read from local dir `static-dir`. We use the `Paste`_ app `static` for that purpose. The relevant part, however, is the second section ``[filter-app:main]``, where we tell `Paste`_ to filter the static content through the `pail` filter app: ``use = egg:pail``. Then we tell the `pail` filter to support the two resolutions of `1024` and `480`: ``resolutions = 1024, 480``. Finally we state to go on with the static app `static`: ``next = static``. With `Paste`_ each filter app needs some other app (or filter app) to filter. Of course, this is only a very plain sample for a `WSGI`_/`Paste`_ setup. You could also create much more complex pipelines with several other filters and adapting images from Plone, Diazo or other content providers. Also the content produced by `pail` could be mangled by further filters in a `WSGI`_ pipeline; that's up to you. See the respective `paste.deploy` documentation_ for details about `Paste`_ configuration files. Example +++++++ Create a virtual environment, activate it, and install pail: .. code-block:: console $ virtualenv py27 # also Python 2.6, 3.2, 3.3 should work $ source py27/bin/activate (py27)$ pip install pail Create a `Paste`_ config in ``pailstatic.ini``: .. code-block:: ini # pailstatic.ini # [server:main] # run an HTTP server on port 8000 use = egg:Paste#http host = 0.0.0.0 port = 8000 [filter-app:main] # filter all requests through pail use = egg:pail resolutions = 1024, 480 next = static [app:static] # serve static content... use = egg:Paste#static # ...from this local directory document_root = %(here)s/static/ Now create the static content: .. code-block:: console (py27)$ mkdir static/ (py27)$ cd static/ Create an HTML file named ``index.html`` like this: .. code-block:: html