Setting Up Environments in CherryPy
Here’s my dilemma, I’m a developer working on code on my machine. Once I’m done I send the code to QA who then says yay or nay. Once I get a yay then the code goes into production on a live server. CherryPy has a site config for all apps as well as an app specific config, which pertains to the code I writing. Under the CherryPy documentation I would have to modify 3 different files in order to add 1 new model! That’s insane.
Additionally, I’m working on my computer (localhost) so I need the SQLObject connections to point to my machine. When I send my work to QA the db connections are completely different. Production environment, again different. Traces, ip address, etc, all different from the various environments. CherryPy 3 does have a “global” config for all apps as well as a “site” config pertaining to your app, but no where does it suggest setting up these environments. Outside of the “environment = whatever” in the config.
Do I really have to write my code on my machine, send it to QA, log into shell and make the modifications, get a yay and send to production, log into shell there and make modifications? Do this across twenty developers as well?
No…
I hope you see the catastrophe that could ensue because an out of the box framework doesn’t allow environments to be set up within an app. Likewise I do judge a framework by the lack of code duplication (DRY). Searching the documentation for CherryPy as well as many other sites I found no information concerning my requirements. So it was time to start “playing”
CherryPy does allow you to remain DRY and set up environments!
Takes a little work around though, but with a deploy script it’s easy.
First let’s create the scripts:
# Site Config (site_config.py)
[global] server.protocol_version = "HTTP/1.1" tools.proxy.on = True tools.proxy.local = "X-Forwarded-Host" tools.proxy.remote = "X-Forwarded-For" log.error_file = "logs/error.log" log.access_file = "logs/access.log"
#Development (development.py)
[global] server.socket_host = "127.0.0.1" server.socket_port = 8082 log.screen = True tools.log_tracebacks.on = True
#QA (qa.py)
[global] server.socket_host = "127.0.0.1" server.socket_port = 8083 log.screen = True tools.log_tracebacks.on = False
#routes.py (routes.py)
[/]
#whatever
#deploy script (deploy.py)
import sys
import cherrypy
import models
from models.base import Base
#add your additional models as well from models folder
if __name__ == '__main__':
cherrypy.config.update(sys.argv[1] + ".py")
cherrypy.config.update(sys.argv[2] + ".py")
cherrypy.tree.mount(Base(), script_name="/", config="routes.py")
cherrypy.engine.start()
So in the command line when you call:
>>python deploy.py site_config.py development
what happens is:
1. Loads the models as classes.
2. cherrypy loads the site wide config variables (site_config.py). These pertain to all the environments.
3. chrrypy loads, adds or overwrites, all the environment settings. Specific to development (locally), qa (hope it works), production (umm better work) ![]()
4. Mounts each model to the correct path as found in the routes.py file which contains settings for each route.
Of course it’s not completely DRY. As each new model is made you do have to update the deploy script as well as the routes.py, but it’s a lot better than doing all your environment files.
I do feel CherryPy would be much more powerful if out of the box we could set up situations like this as well as a plain routes file (Dispatcher) so hacks like this aren’t needed. However this hack at least kept me considering using CherryPy.
Subscribe
June 23rd, 2008 at 11:57 am
This should help: http://www.cherrypy.org/changeset/1987
June 23rd, 2008 at 8:07 pm
Robert,
I’m reaaallllyyy starting to like CherryPy. I’ve figured out the config files and even ditched the whole routes.py file. Thanks, for passing over the link and I hope to have another post up this weekend including RESTful routing and formatting as well.