将痘痘移植到Django

2021-04-12 19:46:16

正如我在2月份提到的那样,我一直在使用灰姑娘项目,试图通过帮助聚集在加利福尼亚州的Covid疫苗和人们如何提供Covid疫苗和如何可以将大流行结束了一点得到它。

Vaccinateca的关键活动正在呼吁检查其可用性和资格标准。直到昨晚,这是由一个受到严重定制的空中实例提供的,伴随着通过某些NetWify功能与AirTable API通信的呼叫者的自定义JavaScript应用程序。

今天,该流量由新的自定义Django后端提供支持,在PostgreSQL之上运行。

这是一个花了我十五年的学习:“让我们建立一件新的东西并更换这个”是可怕的危险:90%的时间你不会完全取代旧的东西,现在你有两个问题!

- Simon Willison(@Simonw)2019年6月29日

用临时转换重写替换现有系统是有风险的。更换构建的系统,该系统是一种像空气一样灵活地在日常发展的基础上是积极的恐怖!

Airtable非常良好地服务,但遗憾的是,对于空洞的行数可以处理的行数并且我们已经反对他们并且必须归档一些数据。继续缩放我们需要迁移的组织。

我们需要使用具有全面的权限控制接口构建匹配的关系数据库,用于编辑它,以及API驱动我们的网站和应用程序。我们需要使用最无聊的技术来做,因此我们可以直接专注于解决问题而不是研究任何新的问题。

Django达到了无聊的技术地位,它永远不会让我惊讶!灰姑式坐落在Django的甜点中。所以我们用它来建立我们的替代品。

基于Django的系统称为样品瓶,用于“疫苗信息归档和图书馆”-A整洁的Jesse Vincent Bacronym。

我们昨晚将事物转移到Vial,但我们也在空调中的活动。我希望我们将继续使用Airtable来完成组织的一生 - 有很多ad-hoc数据项目,它是一个完美的契合。

这里最重要的是对任何信息都有一个值得信赖的单曲真理。我还没有准备好在那一点上宣布胜利,但希望在接下来的几天内完成任何安顿下来。

在甚至写任何代​​码之前,第一个挑战是如何从空中获取的东西。我为这款工具构建了一个刚刚称为Airtable-export,而且它已经在我加入之前已经使用了垃圾舞曲队!

AirTable-export已经运行了几次小时,以JSON格式备份到GitHub存储库(一种Git刮擦)。这使我们提供了对空中数据的更改的详细历史,这偶尔证明对于在更改或删除特定记录时回答问题非常有用。

在GitHub存储库中的数据也是有用的,因为它给了我们某个地方,以从空中的速率范围内拉出数据。

每个Airtable表都以Github存储库中的单个JSON文件最终结束,其中包含一系列对象 - 这些文件变得非常大,在大约80MB时出现。

我开始使用Django管理命令,可以通过文件或URL。关于使用GitHub的一个整洁的事情是,您可以使用“原始数据”链接来获取具有短居住令牌的URL,从而授予对该文件的访问权限。所以我可以创建短期网址并将其直接粘贴到我的导入工具中。

我没有一个很好的模式,可以在Google云运行上运行Django管理命令,因此我开始移动到基于API的导入脚本。

最终工作最佳的模式是提供接受JSON数组的A / API / ImportRecords API端点。

API期望输入在我们的情况下每个记录 - airtable_id中具有唯一主键。然后,它使用django的update_or_create()orm方法如果缺少它们,则会创建新记录,并否则更新现有记录。

一个剩下的挑战:一次性将发布80MB的JSON到API,可能会遇到资源限制。我需要一种方法来打破输入较小的批次。

我最终建立了一个名为Json-Post的新工具。它具有一个非常具体的用例:它是为了将大JSON数组发布到API端点时,但您希望首先将其分解成批次!

以下是如何将JSON在Reports.json中分解为50项阵列,并将其发送到该API作为单独的帖子:

以下是一些更复杂的选项。在这里,我们需要通过授权:Bereer XXXTokexxx API密钥标题,以反向运行阵列,记录我们的进度(从API为Newline-Derimited JSON的JSON响应)到日志文件,设置更长的HTTP读取超时并过滤只是特定项目:

%json-post报告.json \" https://example.com/api/importReports" \ -h授权'持票人xxxtoknxxx' \ b尺寸50 \ - --reverse \ --log /tmp/progress.txt \ --http-readyout 20 \ --filter' item.get(" is_soft_deleted" )'

--filter选项证明特别有用。当我们踢了小瓶上的轮胎时,我们会发现新的错误 - 像导入脚本一样无法正确录制我们在Airtable中使用的IS_Soft_deleted字段。能够过滤使用命令行标志的输入文件意味着我们可以轻松地重新运行Import,仅为受特定错误影响的报告的子集。

--Filter采用Python表达式,该表达式将被编译为函数并传递作为列表中当前项的项目。我从SQLite-Transform工具借用了模式。

Vaccineca的JavaScript调用者应用程序用于通过NetWify函数发送数据以Airtable,这允许添加额外的身份验证使用Auth0构建。

2月回到后,团队有明亮的想法,可以将API流量记录到该函数的函数,以便在空载和响应机构中的单独基础上。

这证明是对调试的无价值。它还意味着当我开始构建“提交呼叫报告”API的替代实施时,我可以重播已记录在该表中的历史API流量,让我提供一种具有现实世界流量的新API的强大方法。

这意味着当我们打开小瓶时,我们可以将现有的JavaScript SPA切换到与其使用现有的空中备份API的完全测试的克隆交谈。

鉴于可写API将在一天内收到几千个请求,将它们保持在数据库表中工作很大。到目前为止,桌子已经发展到90MB。我希望在我们必须担心伐木能力之前将结束大流行!

我们正在使用PostgreSQL JSONB列,通过Django的jsonfield来存储传入和返回的JSON。这意味着我们可以使用PostgreSQL的JSON SQL功能进行深入的API分析!在调试API导入脚本调试问题时,能够检查返回的JSON错误消息或聚合在传入请求主体上有助于。

如今,几乎所有存储在瓶子中的数据都源于空气。一个真正帮助构建系统的技巧是,可能包含导入数据的每个表都具有Airtable_ID可空列和Import_json JSON字段。

任何时候我们导入空载记录,我们都会记录我们用于导入的ID和完整的原始空洞的JSON。

这是调试的另一个强大的工具:我们可以直接在Django管理界面中查看原始的AirTable JSON获取记录,并确认它与我们从中设置的ORM字段匹配。

我提出了一种简单的模式,用于在Django管理员中漂亮印刷所有只读json,它也有助于解决。

担心我最担心的是用Django替换空气的东西是空调的令人难以置信的灵活性。在本组织的短暂生活中,它已经通过在空调中添加新列或建立新视图来解决了这么多问题。

这是与电子表格竞争的自定义软件这么难的原因。

我们只刚刚制作了开关,所以我们不会知道一段时间我们在处理这方面的程度。我有一些机制,我希望有帮助。

第一个是Django-SQL-Dashboard。我在此期间在此处写下这个项目,这里的目标是通过提供一个用于构建SQL查询,书签和保存结果并输出简单的只读机制,将一些想法从DataSette带入Django / PostgreSQL世界。 SQL驱动的可视化。

我们在灰姑娘的情况下有很多SQL知识,所以我的希望是SQL的人们将能够解决自己的问题,并且不了解SQL的人们尚未遇到能够帮助他们的人。

在钻孔技术模型中,Django-SQL-Dashboard计数为主要创新令牌,我正在为这个项目支出。我很乐观,它会得到回报。

我也在沉重地倾向于Django的迁移系统,目的是使数据库迁移普遍和无聊,而不是他们通常的违约才能罕见和令人兴奋。我们已经高达了77次迁移,在一个超过两个月大的码名中!

我认为一种快速地发展数据库模式的文化,尽可能小的戏剧,这对于维持这种组织需求的灵活性至关重要。

除了提供编辑界面的Django管理员之外,通过API致电地进入并超出小瓶中的所有内容。这些完全记录:我希望人们能够独立构建API,特别是对于数据导入等事物。

在HostgreSQL JSON看到与PostgreSQL JSON取得重大成功之后,我考虑将其添加到未来为小瓶添加更多API驱动的灵活性。允许我们的客户开发人员开始从现有的JSON字段中从志愿者收集新的数据,然后一旦证明其值,它就迁移到单独的列中,确实非常诱人。

Django-Reversion和Django-Reversion - 比较提供我们一些核心模型的可扩展,可易阅读的历史

django-admin-tools - 它为管理员添加一个方便的可自定义菜单,很好地链接到其他自定义工具

Django-Migration-Linter - 帮助避免意外运输迁移可能导致在部署期间停机的迁移 灰姑娘正在招聘! 这是一个有趣的演出,因为最终目标是结束大流行,并使这一非营利性永久地摆脱业务。 所以,如果你想更快地帮助结束事物,请联系。 Vaccinateca正在聘请少数工程师来帮助缩放我们的数据摄取并显示超过一个数量级。 如果您想注册兴趣:https://t.co/bsvi40sw1m概括欢迎。 三个子项目; Python后端/行人前端JS。 - Patrick McKenzie(@ Patio11)4月7日,2021年4月7日 JSON帖子:0.2-(3总发布)-2021-04-11将JSON发布到API的工具,分为页面 Airtable - 出口:0.7.1-(10总发布)-2021-04-09将空洞数据导出到磁盘上的YAML,JSON或SQLITE文件 Django-SQL-Dashboard:0.6A0-(13总发布)-2021-04-09 Django应用程序用于使用RAW SQL查询构建仪表板