Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 在任务内切换环境_Django_Fabric - Fatal编程技术网

Django 在任务内切换环境

Django 在任务内切换环境,django,fabric,Django,Fabric,我想用服务器数据库更新我的本地数据库。所以我用3个env创建了一个fabbile。在我的任务中,我首先去服务器,在那里做一些事情,然后我喜欢切换到本地,在那里做一些事情。如何更改任务内部的环境 对于其他东西,我是这样使用的:fab www task,但我只有www env 这是我的fabfile.py: def www(): env.hosts = ['s7.wservices.ch'] env.user = 'beautyparlour' env.dbname =

我想用服务器数据库更新我的本地数据库。所以我用3个env创建了一个fabbile。在我的任务中,我首先去服务器,在那里做一些事情,然后我喜欢切换到本地,在那里做一些事情。如何更改任务内部的环境

对于其他东西,我是这样使用的:
fab www task
,但我只有www env

这是我的fabfile.py:

def www():
    env.hosts  = ['s7.wservices.ch']
    env.user   = 'beautyparlour'
    env.dbname = 'db1'
    env.dbuser = 'user1'
    env.dbpass = 'password'

    env.name_vitualenv = 'django15' #name of the virtualenv
    env.name_folder   = 'projektfoldername' # name of the project folder


def dev():
    env.hosts  = ['s7.wservices.ch']
    env.user   = 'beautyparlour'
    env.dbname = 'db1'
    env.dbuser = 'user1'
    env.dbpass = 'password'

    env.name_vitualenv = 'django15' #name of the virtualenv
    env.name_folder   = 'projektfoldername' # name of the project folder



def home():
    env.hosts = ['localhost']
    env.user = ''
    env.dbname = 'dbx'
    env.dbuser = 'Roland'
    env.dbpass = ''

    env.name_vitualenv = 'django15' #name of the virtualenv
    env.name_folder   = 'projektfoldername' # name of the project folder



def update_db():
    '''
    use this on your local maschine to get the db from the live system
    fab update_db

    1. create a backup on server
    2. download the backup
    3. unzip the packup media and sql
    4. load the sql dump to database

    '''

    # switch env to server ??
    www()

    ...do stuff on server

    # switch env to local ??
    home()

    ... do stuff local

这是用于和的最完美的东西

首先,您可能应该更好地拆分命令,然后创建一些角色定义。如果您想使用特定的环境,那么最好使用
设置

from fabric.api import roles, settings, task

env.roledefs = {
    "www": ["some_remote_server"],
    "other": ["wherever"],
}

@roles("www")
@task
def do_stuff_on_www():
    with settings(user="myname", some_prop="bar"):
        # Do some stuff on the www server
如果您使用的是上下文管理器,那么一旦函数完成,您的环境将重置为最初输入的默认值


顺便说一句,在localhost上运行命令不需要指定任何新的主机定义。您只需运行fabric方法
local
,即可处理本地框上的所有调用
local
是子流程模块的一个方便的包装器,因此后台没有fabric/paramiko魔法。如果您有兴趣查看,可以找到代码

谢谢,这对我来说很好,但是如果我这样做,我如何设置例如
env.user
env.dbname
env.name\u文件夹
。。。对于每种环境?与您以前使用的方法相同?您还可以创建一个新函数
load_env
,该函数扫描您正在使用的角色,然后适当地加载user、dbname和name_文件夹。实际上,最好使用
设置
上下文管理器。我更新了答案以反映这一点我明白了,这当然是一种方式。我的想法是最终有两个文件。文件1:定义环境(如设置文件)。文件2:任务和功能。因此,我可以为每个项目使用相同的两个文件,只需更新file1。我仍然不确定什么是最好的解决方案。因此,原始方法的问题是,您始终需要在函数调用开始时声明任务需要具有哪些设置,否则其他任务的设置将渗透到新任务中,可能会产生错误。上下文管理器最酷的地方是,您可以拥有默认设置,但在需要时会覆盖它们,当您不在管理器中时,您的设置将恢复为默认设置