CherryPy

Pythonic, object-oriented web framework

http://www.cherrypy.org/

Install on Slackware 14

   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

   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

   1 mkdir -p /var/www/htdocs/cherrypytest/static

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

   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                   }}
  29 
  30 application = cherrypy.Application(hello, script_name=None, config=confx)

Create static file

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

Create entry in /etc/httpd/vhosts.conf

   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

Restart apache

   1 /etc/rc.d/rc.httpd restart

Open the following URLs:

CherryPy configuration location

In Slack14 is in

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

   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

   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

   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

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

   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

   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

   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

   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

   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()

Python/CherryPy (last edited 2022-10-21 10:36:28 by localhost)