Создание и перенос проекта на TurboGears

Руководство по созданию проекта на TurboGears.

Фреймворк TurboGears поддерживается на тарифах «Профи», «Плюс» , «Vip» виртуального хостинга. Рекомендуется подключение SSH.

Создание проекта (обязателен полный доступ ssh )

  1. По ssh заходим на свою площадку нашего хостинга.
  2. Перемещаемся в каталог /private (Приложения python лучше разворачивать в каталог private, т.к. в случае установки в каталог httpdocs злоумышленники могут легко получить доступ к персональной информации, например, узнать пароль к базе данных.)
  3. В данном каталоге выполняем следующие команды:
  • Прописываем переменную кэша:
    # export PYTHON_EGG_CACHE="/home/vhosts/ИМЯ_ДОМЕНА/private/.python-eggs"
  • Создаем "скелет" проекта:
    # /opt/python27/turbogears/2.0/bin/paster quickstart
    Следуя инструкциям установки, указываем:
    Enter project name: - имя проекта
    Enter package name [имя проекта]: - имя основного каталога проекта
    Do you need Identity (usernames/passwords) in this project? [no] - нужен ли пользователь и пароль к нему в этом проекте. Если указать no , то начнется установка проекта в Ваш каталог, если указать yes ,  то перед началом установки необходимо указать имя пользователя и пароль к нему.
  1. В каталоге /httpdocs создаем два файла следующего вида:
  • .htaccess:
    AddDefaultCharset utf-8
    Options +ExecCGI
    AddHandler fcgid-script .fcgi
    RewriteEngine On
    RewriteRule   ^(dispatch\.fcgi/.*)$  - [L]
    RewriteRule   ^(.*)$  dispatch.fcgi/$1 [L]
  • dispatch.fcgi:
    #!/opt/python27/turbogears/2.0/bin/python
    turbogears = '/home/vhosts/ИМЯ_ДОМЕНА/private/ИМЯ_ПРОЕКТА'
    inifile = 'development.ini'
    import sys, os
    os.environ['PYTHON_EGG_CACHE'] = "/home/vhosts/ИМЯ_ДОМЕНА/private/.python-eggs"
    sys.path.insert(0, turbogears)
    from paste.deploy import loadapp
    wsgi_app = loadapp('config:' + turbogears + '/' + inifile)
    if __name__ == '__main__':
        from flup.server.fcgi import WSGIServer
        WSGIServer(wsgi_app).run()
  1. Устанавливаем права доступа:
  • .htaccess - 644
  • dispatch.fcgi - 700
    # chmod 644 .htaccess
    # chmod 744 dispatch.fcgi
  1. Готово.

Перенос проекта (необязателен полный доступ ssh)

  1. Закачиваем готовый проект turbogears на вашу площадку в папку /private
  2. Закачиваем дамп БД с помощью консоли или phpMyAdmin.
  3. Создаем файлы .htaccess (согласно пункту 4 - Создание проекта) и dispatch.fcgi:
    dispatch.fcgi (для версий turbogears ниже 2.0):
    #!/opt/python25/bin/python
    #
    # File name: tg_fastcgi.fcgi
    #
    
    import cherrypy
    import sys
    import os
    os.environ['PYTHON_EGG_CACHE'] =  "/home/vhosts/ИМЯ_ДОМЕНА/private/.python-eggs"
    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/vhosts/ИМЯ_ДОМЕНА/private/ИМЯ_ПРОЕКТА'
    root_class_name = 'ИМЯ_ПРОЕКТА.controllers.Root'
    project_module_name = 'ИМЯ_ПРОЕКТА.config.app'
    log_dir = '/home/vhosts/ИМЯ_ДОМЕНА/private/ИМЯ_ПРОЕКТА'                                
    # -- 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.path
            if path == prefix:
                path = '/'
            elif path.startswith(prefix):
                path = path[len(prefix):]
            else:
                raise cherrypy.NotFound(path)
    
            cherrypy.request.path = path
    
            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, "devcfg.py"),modulename=project_module_name)
        else:
            turbogears.update_config(configfile=join(code_dir, "prodcfg.py"),modulename=project_module_name)
    
        # Set environment to production to disable auto-reload and
        # add virutal path information.
        cherrypy.config.update({
            'global': {'server.environment': 'production'}})
    
        # 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.fcgi import WSGIServer
    cherrypy.server.start(initOnly=True, serverClass=None)
    
    from cherrypy._cpwsgi import wsgiApp
    WSGIServer(application=wsgiApp).run()
    dispatch.fcgi (для версий turbogears выше 2.0):
    #!/opt/python27/turbogears/2.0/bin/python
    turbogears = '/home/vhosts/ИМЯ_ДОМЕНА/private/ИМЯ_ПРОЕКТА'
    inifile = 'development.ini'
    import sys, os
    os.environ['PYTHON_EGG_CACHE'] = "/home/vhosts/ИМЯ_ДОМЕНА/private/.python-eggs"
    sys.path.insert(0, turbogears)
    from paste.deploy import loadapp
    wsgi_app = loadapp('config:' + turbogears + '/' + inifile)
    if __name__ == '__main__':
        from flup.server.fcgi import WSGIServer
        WSGIServer(wsgi_app).run()
    Е сли требуется версия python ниже версии 2.7, то строку файла dispatch.fcgi
    #!/opt/python27/turbogears/2.0/bin/python
    нужно заменить на строку соответвующей требуемой версии интерпритатора, см. " Пути к интерпретаторам "
  4. Редактируем файлы конфигурации фреймворка на правильность путей и подключения к БД.
  5. Готово.

Если у Вас возникли какие то сложности по поводу данной темы, обращайтесь в круглосуточную Службу технической поддержки хостинга.

Вам также может помочь