Ответ 1
Вы можете использовать функции append()
или upload_template()
из fabric.contrib.files
Я хотел бы создать файл с именем user_wsgi.py на удаленном хосте. Я бы хотел использовать следующую строку для создания содержимого файла:
'''
import sys, os
sys.path.insert(0, "/ruby/%s/www/%s/django-projects")
sys.path.insert(0, "/ruby/%s/www/%s/django-projects/project")
import django.core.handlers.wsgi
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
application = django.core.handlers.wsgi.WSGIHandler()
''' % (user,host,user,host)
Пользовательские и хост-переменные будут параметрами функции ткани.
Я полный новичок в любых манипуляциях с файлами на python, но также не уверен, что должна быть процедура в ткани. Должен ли я создавать файл локально, а затем загружать его с помощью команды put put (а затем удалять локальную версию)? Должен ли я создавать файл на удаленном хосте с помощью соответствующей команды bash (с использованием тэга)? Если да, то как лучше всего разобраться со всеми "и" в строке - может ли ткань избежать этого? Или я должен заниматься этим по-другому?
Вы можете использовать функции append()
или upload_template()
из fabric.contrib.files
Используйте StringIO с put:
text = '''
import sys, os
sys.path.insert(0, "/ruby/%s/www/%s/django-projects")
sys.path.insert(0, "/ruby/%s/www/%s/django-projects/project")
import django.core.handlers.wsgi
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
application = django.core.handlers.wsgi.WSGIHandler()
''' % (user, host, user, host)
import StringIO
put(StringIO.StringIO(text), "remote-path")
То, что я делаю, это локальный файл как нечто вроде "app.wsgi.template".
Затем я использую токены в файле, например:
import sys, os
sys.path.insert(0, "/ruby/$HOST$/www/$HOST$/django-projects")
sys.path.insert(0, "/ruby/$HOST$/www/$HOST$/django-projects/project")
import django.core.handlers.wsgi
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
application = django.core.handlers.wsgi.WSGIHandler()
Я использую ткань, чтобы "поместить" файл на удаленный хост, затем используйте "sed" (или эквивалентные функции в Python), чтобы заменить токены "$ HOST $" и "$ USER $" значениями, которые я хочу.
run("sed -i backup -e 's/$USER$/%s' -e 's/$HOST$/%s' app.wsgi.template" % (user, host))
run("mv app.wsgi.template app.wsgi")
StringIO с put работает с небольшим количеством редактирования. Попробуйте следующее:
put(StringIO.StringIO(
'''
import sys, os
sys.path.insert(0, "/ruby/%s/www/%s/django-projects")
sys.path.insert(0, "/ruby/%s/www/%s/django-projects/project")
import django.core.handlers.wsgi
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
application = django.core.handlers.wsgi.WSGIHandler()
''' % (user,host,user,host)), "remote-path")
Если у вас есть проблема с разрешениями, попробуйте следующее:
put(StringIO.StringIO(
'''
import sys, os
sys.path.insert(0, "/ruby/%s/www/%s/django-projects")
sys.path.insert(0, "/ruby/%s/www/%s/django-projects/project")
import django.core.handlers.wsgi
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
application = django.core.handlers.wsgi.WSGIHandler()
''' % (user,host,user,host)), "remote-path", use_sudo=True)