Hi all- This might be a difficult question for people here to help me with, but I thought I'd give it a shot anyway.
I am trying to get TG up and running on MediaTemple grid services. I am interested in the grid aspects especially, and they support django already, give me shell access and have python 2.4 installed. So I figured I'd give it a shot... Installing all the eggs was a breeze (well I have done this on several hosting providers, so I know what I am doing now). I can start up turbogears (on port 4000) no problem, wget gets valid pages. So I was then confronted with the problem of "how do I get this serving data on port 80?". Well this is the sticking point. I found a good description of doing this using FCGI with flup for django. https://forums.mediatemple.net/viewtopic.php?id=1371 Then I found the turbogears page for setting up fcgi with flup for lighthttpd. I cobbled together the following fcgi script, from some dreamhost wiki's and turbogears docs: #!/usr/bin/env python # # File name: tg_fastcgi.fcgi # # This module provides the glue for running TurboGears applications behind # FastCGI-enabled web servers. The code in this module depends on the fastcgi # module downloadable from here: # # http://www.saddi.com/software/py-lib/py-lib/fcgi.py # # NOTE: The fcgi.py file needs to be placed in a location that is on the # system path, such as the same the directory as the tg_fastcgi.py file # or in the base directory of the TG app code. # # To configure this module, please edit the three variables in the "USER EDIT # SECTION" before starting the TG application. Also remember to edit the # top of this file with the correct Python installation information. # # 2006-04-17 # ---------- # * Updated for 0.9a4 by Mikael Jansson <[EMAIL PROTECTED]> for changes in # config files. # * Removed hard TABs # import sys sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/setuptools-0.6c9-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/CherryPy-2.3.0-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/TurboGears-1.0.7-py2.4.egg/turbogears") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/flup-1.0.1-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/configobj-4.5.3-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/BeautifulSoup-3.0.7a-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/Cheetah-2.0.1-py2.4-linux-i686.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/DecoratorTools-1.7-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/Extremes-1.1-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/FormEncode-1.0.1-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/PIL") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/Paste-1.7.1-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/PasteDeploy-1.3.2-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/PasteScript-1.6.3-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/PyProtocols-1.0a0-py2.4-linux-i686.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/RuleDispatch-0.5a1.dev_r2506-py2.4-linux-i686.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/SQLObject-0.10.2-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/TGCaptcha-0.11-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/TurboCheetah-1.0-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/TurboJson-1.1.4-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/TurboKid-1.0.4-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/Twisted-8.1.0-py2.4-linux-i686.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/kid-0.9.6-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/python_twitter-0.5-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/pycrypto-2.0.1-py2.4-linux-i686.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/registration-0.50-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/scgi-1.13-py2.4-linux-i686.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/setuptools-0.6c9-py2.4.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/simplejson-1.9.3-py2.4-linux-i686.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/zope.interface-3.4.1-py2.4-linux-i686.egg") sys.path.insert(0, "/home/51440/users/.home/lib/python2.4/site- packages/mx/Tidy")sys.path.insert(0, "/home/51440/users/.home/lib/ python2.4/site-packages/mx/Number") import cherrypy import os from os.path import * import pkg_resources import turbogears pkg_resources.require("TurboGears") # -- START USER EDIT SECTION # -- Users must edit this section -- code_dir = '/home/blah/users/.home/ blah/' # (Required) The base directory of the TG app code. root_class_name = 'blah.controllers.Root' # (Required) The fully qualified Root class name. project_module_name = 'blah.config' # (Required) The config module name. Replace # PROJECTNAME with your project's name (e.g. wiki20). log_dir = '' # (Optional) The log directory. Default = code_dir. # -- END USER EDIT SECTION class VirtualPathFilter(object): def on_start_resource(self): if not cherrypy.config.get('virtual_path_filter.on', False): return prefix = cherrypy.config.get('virtual_path_filter.prefix', '') if not prefix: return path = cherrypy.request.object_path if path == prefix: path = '/' elif path.startswith(prefix): path = path[len(prefix):] else: raise cherrypy.NotFound(path) cherrypy.request.object_path = path def tg_init(): """ Checks for the required data and initializes the application. """ global code_dir global root_class_name global log_dir global project_module_name last_mark = 0 # Input checks if not code_dir or not isdir(code_dir): raise ValueError("""The code directory setting is missing. The fastcgi code will be unable to find the TG code without this setting.""") if not root_class_name: raise ValueError("""The fully qualified root class name must be provided.""") last_mark = root_class_name.rfind('.') if (last_mark < 1) or (last_mark + 1) == len(root_class_name): raise ValueError("""The user-defined class name is invalid. Please make sure to include a fully qualified class name for the root_class value (e.g. wiki20.controllers.Root).""") sys.path.append(code_dir) # Change the directory so the TG log file will not be written to the # web app root. if log_dir and isdir(log_dir): os.chdir(log_dir) else: os.chdir(code_dir) log_dir = code_dir sys.stdout = open(join(log_dir, 'stdout.log'),'a') sys.stderr = open(join(log_dir, 'stderr.log'),'a') if exists(join(code_dir, "setup.py")): turbogears.update_config(configfile=join(code_dir, "dev.cfg"),modulename=project_module_name) else: turbogears.update_config(configfile=join(code_dir, "prod.cfg"),modulename=project_module_name) # Set environment to production to disable auto-reload and # add virutal path information. cherrypy.config.update({ 'global': {'server.environment': 'production'}, '/' : { 'virtual_path_filter.on' : True, 'virtual_path_filter.prefix' : '/tg_fastcgi.fcgi' } }) # Parse out the root class information for Cherrypy Root class. # add virutal path information. cherrypy.config.update({ 'global': {'server.environment': 'production'}, '/' : { 'virtual_path_filter.on' : True, 'virtual_path_filter.prefix' : '/tg_fastcgi.fcgi' }, 'autoreload.on':False }) # Parse out the root class information for Cherrypy Root class. package_name = root_class_name[:last_mark] class_name = root_class_name[last_mark+1:] exec('from %s import %s as Root' % (package_name, class_name)) Root._cp_filters = [VirtualPathFilter()] cherrypy.root = Root() # Main section - # Initialize the application, then start the server. tg_init() from flup.server.scgi import WSGIServer import atexit #from fcgi import WSGIServer if cherrypy.server.state == 0: atexit.register(cherrypy.server.stop) cherrypy.server.start(initOnly=True, serverClass=None) from cherrypy._cpwsgi import wsgiApp try: WSGIServer(application=wsgiApp).run() except Exception, e: print e Here is the issue, it does seem to work, it fires off WSGI (I can see them in the logs), but then it just hangs. When I go to hit the url again, I start seeing "Address already in use" errors, like it is trying to fire off the cherrpy server again... What does this mean? Why is it trying to fire off more than one WSGIServer instance? How does this work, how do my requests, which will all hit this script get to my WSGI/CherryPy/TG instance? I am 8 hours in and thouroughly confused, but I think this should work, it should be very similar to django, and evidently others have successfully run TG behind apache using the flub framework. Any help is hugely appreciated. James --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "TurboGears" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/turbogears?hl=en -~----------~----~----~----~------~----~------~--~---

