Getting started with cherrypy

Hello world in CherryPy

If you have a virtualenv and CherryPy is already installed in it, create a file

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import cherrypy

class HelloWorld(object):
    def index(self):
        return 'Hello World!'

    def greet(self, name):
        return 'Hello {}!'.format(name)


Then execute the file: $ or $ python You should see output similar to this:

[email protected] /develop/myapp $ python
[06/Nov/2016:05:58:44] ENGINE Listening for SIGTERM.
[06/Nov/2016:05:58:44] ENGINE Bus STARTING
[06/Nov/2016:05:58:44] ENGINE Set handler for console events.
CherryPy Checker:
The Application mounted at '' has an empty config.

[06/Nov/2016:05:58:44] ENGINE Started monitor thread '_TimeoutMonitor'.
[06/Nov/2016:05:58:44] ENGINE Started monitor thread 'Autoreloader'.
[06/Nov/2016:05:58:45] ENGINE Serving on
[06/Nov/2016:05:58:45] ENGINE Bus STARTED

Installation instructions


  • These instructions suppose you have any type of Linux, Unix, Mac with bash or Git-bash Windows.
  • Windows: Download and install Git-bash for Windows, then execute ‘bash’ from command line.
  • Other shells than bash are fine too, just replace the activate command below with activate.csh or Google: “virtualenv activate your-shell-name”.

Before you start, check that Python, virtualenv and pip are installed:

  • $ python --version
  • $ virtualenv --version
  • $ pip --version


Create a directory with your web/app, create environment and install CherryPy package.

  • $ mkdir /develop/myapp/
  • $ cd /develop/myapp/
  • $ virtualenv venv
  • $ source venv/bin/activate
    • On Windows in Git-bash: $ source venv/Scripts/activate
  • (venv) $ pip install cherrypy
  • (venv) $ python
Python 3.5.2 ...
>>> import cherrypy
>>> cherrypy
<module 'cherrypy' from '... venv/site-packages/cherrypy/'>

Congratulations! Now you are ready for your first CherryPy application.

File upload with CherryPy

This example consists of three parts:

  • - CherryPy application that can receive and save a file.
  • webpage.html - Example how to upload a file to from a webpage.
  • - Example how to upload a file to from a command line tool.
  • Bonus - upload.txt - file that you will upload.

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import os
import cherrypy

config = {
    'global' : {
        'server.socket_host' : '',
        'server.socket_port' : 8080

class App:

    def upload(self, ufile):
        # Either save the file to the directory where is
        # or save the file to a given path:
        # upload_path = '/path/to/project/data/'
        upload_path = os.path.dirname(__file__)

        # Save the file to a predefined filename
        # or use the filename sent by the client:
        # upload_filename = ufile.filename
        upload_filename = 'saved.txt'

        upload_file = os.path.normpath(
            os.path.join(upload_path, upload_filename))
        size = 0
        with open(upload_file, 'wb') as out:
            while True:
                data =
                if not data:
                size += len(data)
        out = '''
File received.
Filename: {}
Length: {}
Mime-type: {}
''' .format(ufile.filename, size, ufile.content_type, data)
        return out

if __name__ == '__main__':
    cherrypy.quickstart(App(), '/', config)


<form method="post" action="" enctype="multipart/form-data">
    <input type="file" name="ufile" />
    <input type="submit" />

This example requires Python requests package, however file can be sent to server in plain Python.

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import requests

url = ''
files = {'ufile': open('file.txt', 'rb')}

r =, files=files)



Hello! This file was uploaded to CherryPy.

Upload from browser

  • Run $
  • Open webpage.html in your web browser.
  • After you select file from your drive and submit it, it will be saved as saved.txt.

Upload from command line

  • Open one console and run $

  • Open another console and run $

    • Note: Test file upload.txt should be in the same directory with
  • File upload.txt should be uploaded and saved as saved.txt.