******************************* Your first CherryPy application ******************************* The standard 'Hello world!' application takes less than 10 lines of code when written using CherryPy:: import cherrypy class HelloWorld: def index(self): return "Hello world!" index.exposed = True cherrypy.quickstart(HelloWorld()) We assume that you already have :doc:`installed ` CherryPy. Copy the file above and save it locally as ``hello.py``, then start the application at the command prompt:: $ python hello.py Direct your favorite web browser to http://localhost:8080 and you should see ``Hello world!`` printed there. How does it work? ----------------- Let's take a look at ``hello.py``: * The ``import cherrypy`` statement imports the main CherryPy module. This is all that is required to have CherryPy working. Feel free to "import cherrypy" in an interactive session and see what's available! ``help(cherrypy)`` is also quite useful. * We declare a class named ``HelloWorld``. An instance of this class is the object that will be published by CherryPy. It contains a single method, named ``index``, which will get called when the root URL for the site is requested (for example, ``http://localhost/``). This method returns the **contents** of the Web page; in this case, the ``'Hello World!'`` string. Note that you don't have to subclass any framework-provided classes; in fact, you don't even have to use classes at all! But let's start with them for now. * The ``index.exposed = True`` is a necessary step to tell CherryPy that the ``index()`` method will be **exposed**. Only exposed methods can be called to answer a request. This feature allows the user to select which methods of an object will be accessible via the Web; non-exposed methods can't be accessed. * ``cherrypy.quickstart(HelloWorld())`` mounts an instance of the HelloWorld class, and starts the embedded webserver. It runs until explicitly interrupted, either with ``Ctrl-C`` or via a suitable signal (a simple ``kill`` on Unix will do it). When the application is executed, the CherryPy server is started with the default configuration. It will listen on ``localhost`` at port ``8080``. These defaults can be overridden by using a configuration file or dictionary (more on this later). Finally, the web server receives the request for the URL ``http://localhost:8080``. It searches for the best method to handle the request, starting from the ``HelloWorld`` instance. In this particular case, the root of the site is automatically mapped to the ``index()`` method (similar to the ``index.html`` that is the standard page for conventional Web servers). The HelloWorld class defines an ``index()`` method and exposes it. CherryPy calls ``HelloWorld().index()``, and the result of the call is sent back to the browser as the contents of the index page for the website. All the dispatching and HTTP-processing work is done automatically; the application programmer only needs to provide the desired content as the return value of the ``index`` method. CherryPy structure ------------------ Most of the features of CherryPy are available through the :mod:`cherrypy` module. It contains several members: * :class:`cherrypy.engine ` controls process startup, shutdown, and other events, including your own Plugins. See :doc:`/concepts/engine`. * :class:`cherrypy.server ` configures and controls the HTTP server. * :class:`cherrypy.request ` contains all the information that comes with the HTTP request, after it is parsed and analyzed by CherryPy. * :attr:`cherrypy.request.headers ` contains a mapping with the header options that were sent as part of the request. * :class:`cherrypy.session ` is a special mapping that is automatically generated and encoded by CherryPy; it can be used to store session-data in a persistent cookie. For it to work you have to enable the session functionality by setting 'tools.session.on' to True in your config. * :class:`cherrypy.response ` contains the data that is used to build the HTTP response. * :attr:`cherrypy.response.headers ` contains a mapping with the header options that will be returned by the server, before the contents get sent. * :attr:`cherrypy.response.body ` contains the actual contents of the webpage that will be sent as a response.