MoinMoin Logo
  • Comments
  • Immutable Page
  • Menu
    • Navigation
    • RecentChanges
    • FindPage
    • Local Site Map
    • Help
    • HelpContents
    • HelpOnMoinWikiSyntax
    • Display
    • Attachments
    • Info
    • Raw Text
    • Print View
    • Edit
    • Load
    • Save
  • Login

Navigation

  • Start
  • Sitemap

Upload page content

You can upload content for the page named below. If you change the page name, you can also upload content for another page. If the page name is empty, we derive the page name from the file name.

File to load page content from
Page name
Comment

Revision 35 as of 2025-02-08 14:10:19
  • Python
  • CherryPy

Contents

  1. CherryPy
    1. Install on Slackware 14
    2. Check installation
    3. CherryPy test web app
    4. CherryPy configuration location
    5. Templating
    6. REST
    7. Install python 3.8.5 in raspberry py
    8. Console app
    9. Docker + cherrypy + ubuntu

CherryPy

Pythonic, object-oriented web framework

http://www.cherrypy.org/

Install on Slackware 14

Toggle line numbers
   1 wget https://pypi.python.org/packages/source/C/CherryPy/CherryPy-3.2.4.tar.gz
   2 cp CherryPy-3.2.4.tar.gz /tmp
   3 cd /tmp
   4 tar xvzf CherryPy-3.2.4.tar.gz
   5 cd CherryPy-3.2.4
   6 python setup.py build
   7 python setup.py install

Check installation

Toggle line numbers
   1 # python
   2 # Python 2.7.3 (default, Jul  3 2012, 21:16:07) 
   3 # [GCC 4.7.1] on linux2
   4 # Type "help", "copyright", "credits" or "license" for more information.
   5 import cherrypy
   6 cherrypy.__version__
   7 # '3.2.2'
   8 quit()

CherryPy test web app

Create folder the web app

Toggle line numbers
   1 mkdir -p /var/www/htdocs/cherrypytest/static

Create file /var/www/htdocs/cherrypytest/cherrypytest.wsgi

Toggle line numbers
   1 import sys
   2 sys.stdout = sys.stderr
   3 import cherrypy
   4 
   5 cherrypy.config.update({'environment': 'embedded'})
   6 
   7 class HelloWorld(object):
   8     @cherrypy.expose
   9     def index(self):
  10         return "Hello World CherryPy!!!!"
  11 
  12     @cherrypy.expose
  13     def add(self,param1,param2):
  14        return str( int(param1)+int(param2) )
  15 
  16     @cherrypy.expose
  17     @cherrypy.tools.json_in()
  18     @cherrypy.tools.json_out()
  19     def hellojson(self): 
  20         #  curl -X POST -d "{\"name\":\"jkl\"}" http://localhostcherrypytest/hellojson --header "Content-Type:application/json"
  21         inj = cherrypy.request.json
  22         return {"message": "hello world " + inj['name'] }
  23 
  24 hello = HelloWorld()    
  25 #static dir
  26 confx={'/static': {'tools.staticdir.on':True ,
  27                   'tools.staticdir.dir':'/var/www/htdocs/cherrypytest/static',
  28                   'tools.gzip.on': True, 
  29                   'tools.gzip.mime_types': ['text/*', 'application/*']
  30                   }}
  31 
  32 application = cherrypy.Application(hello, script_name=None, config=confx)

Create static file

Toggle line numbers
   1 echo "Static Test" > /var/www/htdocs/cherrypytest/static/a.txt 

Create entry in /etc/httpd/vhosts.conf

Toggle line numbers
   1 <VirtualHost *:80>
   2     ServerName localhostcherrypytest
   3     DocumentRoot "/var/www/htdocs/cherrypytest"
   4     WSGIScriptAlias / /var/www/htdocs/cherrypytest/cherrypytest.wsgi
   5     <Directory "/var/www/htdocs/cherrypytest">
   6       Require local
   7     </Directory>
   8 </VirtualHost>

Add entry in /etc/hosts

  • 127.0.0.1 localhostcherrypytest

Restart apache

Toggle line numbers
   1 /etc/rc.d/rc.httpd restart

Open the following URLs:

  • http://localhostcherrypytest/

  • http://localhostcherrypytest/add/3/4

  • http://localhostcherrypytest/static/a.txt

CherryPy configuration location

In Slack14 is in

  • /usr/lib/python2.7/site-packages/CherryPy-3.2.2-py2.7.egg/cherrypy/_cpconfig.py

Inside the file look for Config.environments . Run python interactively to check the environments

Toggle line numbers
   1 import cherrypy
   2 envs= cherrypy._cpconfig.environments #dictionary
   3 envs['embedded']
   4 # {'checker.on': True, 'engine.SIGTERM': None, 'request.show_mismatched_params': True, 'request.show_tracebacks': True, 'engine.autoreload_on': False, 'tools.log_headers.on': True, 'log.screen': True, 'engine.SIGHUP': None}
   5 envs['production']
   6 # {'request.show_tracebacks': False, 'log.screen': False, 'request.show_mismatched_params': False, 'checker.on': False, 'engine.autoreload_on': False, 'tools.log_headers.on': False}

Open URL http://localhostcherrypytest/add/1/2a with environment embedded will show a traceback.

To disable the traceback add the follow inside the class HelloWorld

Toggle line numbers
   1 class HelloWorld(object):
   2     _cp_config = {'request.show_tracebacks': False}
   3     @cherrypy.expose
   4     def index(self):
   5         return "Hello World CherryPy!!!!"
   6     @cherrypy.expose
   7     def add(self,param1,param2):
   8        return str( int(param1)+int(param2) )

Templating

Check Python/Jinja2

REST

https://cherrypy.readthedocs.org/en/3.2.6/progguide/REST.html

REST quick tips: http://www.restapitutorial.com/lessons/restquicktips.html

Install python 3.8.5 in raspberry py

Toggle line numbers
   1 tar xvzf Python-3.8.5.tgz 
   2 cd Python-3.8.5/
   3 ./configure 
   4 make clean
   5 make
   6 make install
   7 sudo make install
   8 /usr/local/bin/python3.8 -v
   9 /usr/local/bin/pip3.8 install cherrypy

Console app

  • http://localhost:8080/middle/goodbye/

  • http://localhost:8080/middle

  • http://localhost:8080/

Toggle line numbers
   1 pip install cherrypy routes --user
   2 python main.py

Toggle line numbers
   1 import cherrypy
   2 import wsgiref.handlers
   3 
   4 class RootUrl:
   5   @cherrypy.expose
   6   def index(self):
   7     return "Hello world!"
   8 
   9 class Middle:
  10   @cherrypy.expose
  11   def index(self):
  12     return "middle"
  13 
  14 class GoodbyeWorld:
  15    @cherrypy.expose
  16    def index(self,num=None):
  17      return "Goodbye World!"
  18 
  19 def main():
  20   ru = RootUrl()
  21   ru.middle = Middle()
  22   ru.middle.goodbye  = GoodbyeWorld()
  23   cherrypy.server.socket_host = '0.0.0.0'
  24   cherrypy.quickstart(ru) 
  25 
  26 if __name__ == '__main__':
  27   main()

Docker + cherrypy + ubuntu

Toggle line numbers
   1 # build.sh 
   2 docker build -t test1-image .
   3 mkdir mnt_data
   4 docker run -p 8181:8080 -d --rm --mount type=bind,source="$(pwd)"/mnt_data,target=/mnt/data test1-image
   5 # what is written in the folder /mnt/data located in the container is shared in the folder mnt_data
   6 docker run -p 8282:8080 -d --rm \
   7   --mount type=bind,source="$(pwd)"/mnt_data,target=/mnt/data \
   8   test1-image
   9 ab -n 10000 -c 10 http://localhost:8181/ &
  10 ab -n 10000 -c 10 http://localhost:8282/ &
  11 tail -f mnt_data/filex.log

Toggle line numbers
   1 cd ~
   2 cd Documents
   3 mkdir test-cherrypy
   4 cd test-cherrypy
   5 docker build -t test1-image .
   6 docker run -p 8181:8080 -d --rm test1-image # expose internal port 8080 to 8181
   7 curl localhost:8181
   8 docker exec -it 94af745958fa bash
   9 # edit main.py to change return message
  10 curl localhost:8181/middle/goodbye/
  11 docker stop 94af745958fa

Dockerfile

Toggle line numbers
   1 FROM ubuntu:latest
   2 RUN apt update
   3 RUN apt install -y nano vim python curl
   4 RUN curl https://bootstrap.pypa.io/pip/2.7/get-pip.py > get-pip.py
   5 RUN python get-pip.py
   6 RUN pip install cherrypy routes --user
   7 RUN mkdir /app
   8 COPY . /app/
   9 WORKDIR /app
  10 CMD ["python","main.py"]

main.py

Toggle line numbers
   1 import cherrypy
   2 import wsgiref.handlers
   3 import time
   4 import socket 
   5 
   6 class RootUrl:
   7   @cherrypy.expose
   8   def index(self):
   9     f=open('/mnt/data/filex.log','a')
  10     f.write('%s %f\n'%( socket.gethostname(),  time.time()))
  11     f.close()
  12     return "Hello world ola mundo"
  13 
  14 class Middle:
  15   @cherrypy.expose
  16   def index(self):
  17     return "middle"
  18 
  19 class GoodbyeWorld:
  20    @cherrypy.expose
  21    def index(self,num=None):
  22      return "Goodbye World!"
  23 
  24 def main():
  25   ru = RootUrl()
  26   ru.middle = Middle()
  27   ru.middle.goodbye  = GoodbyeWorld()
  28   cherrypy.server.socket_host = '0.0.0.0'
  29   cherrypy.quickstart(ru) 
  30 
  31 if __name__ == '__main__':
  32   main()
  • MoinMoin Powered
  • Python Powered
  • GPL licensed
  • Valid HTML 4.01