Как создать новый файл на удаленном узле в базе данных (средство развертывания python)?

Я хотел бы создать файл с именем 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 (с использованием тэга)? Если да, то как лучше всего разобраться со всеми "и" в строке - может ли ткань избежать этого? Или я должен заниматься этим по-другому?

Ответы

Ответ 1

Вы можете использовать функции append() или upload_template() из fabric.contrib.files

Ответ 2

Используйте 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")

Ответ 3

То, что я делаю, это локальный файл как нечто вроде "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")

Ответ 4

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)