我有一个有三种环境的Django网站(本地,分期,制作)。
生产包含一些我不希望开发人员访问的数据(用户的个人数据和财务数据)。
执行数据库备份还原不是合规性原因的选项。
但是,我们在本网站上也有一些我们使用Wagtail CMS管理的内容页面。
我正在寻找一种方法,可以在需要时将生产数据(只有一些模型,特别是wagtail页面)同步回Staging and Developers本地环境。
理想情况下,我会有一个管理命令,我可以在另一个环境中运行来复制数据:
示例:./manage.py sync_from_prod BlogPost
这将在本地或登台环境中找到所有缺少的博文,并将在数据库中创建它们。我找不到任何为Wagtail或Django这样做的库。
这似乎是一个常见的问题,我很惊讶没有发现Stackoverflow问题或开源库解决了这个问题。
如果不存在,我可能会尝试编写我自己的django-model-sync(发现这个项目,但是3岁并兼容到django 1.7,我在python3 django 1.11上)
为了管理安全性,开发人员可以使用秘密来访问公开数据的生产API(例如,通过ssl)
答案 0 :(得分:1)
您可以对要复制的模型使用命令dumpdata
。
在生产命令./manage.py dumpdata app_name.model_name > model_name.json
中使用。这会将所选数据库表的所有数据保存在文件model_name.json
中。
然后在本地或阶段服务器上使用loaddata
来处理此文件:
./manage.py loaddata model_name.json
。
您可以在此处了解更多信息:https://the-bosha.ru/2016/06/29/django-delaem-damp-bazy-dannykh-i-vosstanavlivaem-iz-nego-s-dumpdata-i-loaddata/ (仅限俄语说明)
答案 1 :(得分:0)
您可以在prod中使用dumpdata
命令(或扩展命令)来获取博客数据的JSON导出,然后在本地使用loaddata
命令保存到您的本地环境中。 / p>
如何实施工作流程完全取决于您,例如。您可能希望将dumpdata
命令包装在prod上的受保护API中,然后在本地环境中创建/运行sync_from_prod
命令以调用该api并使用JSON导出执行call_command('loaddata', 'data_file.json')
命令生产数据。
PSEUDO CODE:
# the api view to provide the data on prod
def dumpdata_view(requst):
output = StringIO.StringIO()
call_command('dumpdata', output=output)
output.seek(0)
return JsonResponse(output.readlines()
# command to execute locally
class sync_from_prod(BaseCommand):
def handle(self, *args, **kwargs):
with open('data_file.json', 'w') as f:
data = requests.get('https://prod/api/dumpdata?model=BlogPost')
f.write(data.content)
call_command('loaddata', 'data_file.json')