Создание и перенос проекта на TurboGears
Руководство по созданию проекта на TurboGears.
Фреймворк TurboGears поддерживается на тарифах «Профи», «Плюс» , «Vip» виртуального хостинга. Рекомендуется подключение SSH.
Создание проекта (обязателен полный доступ ssh )
- По ssh заходим на свою площадку нашего хостинга.
- Перемещаемся в каталог /private (Приложения python лучше разворачивать в каталог private, т.к. в случае установки в каталог httpdocs злоумышленники могут легко получить доступ к персональной информации, например, узнать пароль к базе данных.)
- В данном каталоге выполняем следующие команды:
-
Прописываем переменную кэша:
# 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 , то перед началом установки необходимо указать имя пользователя и пароль к нему.
- В каталоге /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()
- Устанавливаем права доступа:
- .htaccess - 644
-
dispatch.fcgi - 700
# chmod 644 .htaccess # chmod 744 dispatch.fcgi
- Готово.
Перенос проекта (необязателен полный доступ ssh)
- Закачиваем готовый проект turbogears на вашу площадку в папку /private
- Закачиваем дамп БД с помощью консоли или phpMyAdmin.
-
Создаем файлы
.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
нужно заменить на строку соответвующей требуемой версии интерпритатора, см. " Пути к интерпретаторам " - Редактируем файлы конфигурации фреймворка на правильность путей и подключения к БД.
- Готово.
Если у Вас возникли какие то сложности по поводу данной темы, обращайтесь в круглосуточную Службу технической поддержки хостинга.