在 DocAssemble 面试中访问由模块处理的文件

Access file processed by a module in DocAssemble interview

我写了一个 python 模块,它根据一堆值生成图像作为绘图。该模块使用 matplotlib 和 pandas 生成图像。现在我在从 DocAssemble 内部访问图像以将图像放入 docx 模板时遇到了一些麻烦。因此我有一些问题:

  1. 图像将保存在 /usr/share/docassemble/files/image.png 的模块中。我不认为这是在 DA 中保存文件的正确路径。我在哪里可以保存这些文件以便在以后的采访中访问?
plt.savefig("/usr/share/docassemble/files/image.png")
  1. 使用 DA YAML 从这样的路径将图像实现为 docx 文档的正确方法是什么?

从 da yml 文件中提取

---
modules:
  - .plot_file
[...]
---
code: |
 plot_file(datapoints)

您可以在 YAML 中初始化一个 DAFile 对象,然后将该对象传递给您的 plot_file() 函数。您的 plot_file() 函数可以将数据写入 .path() 指示的路径,然后 运行 .commit()。这将确保即使服务器将其文件保存在 S3 上,您的代码也能正常工作。

modules:
  - .plot_file
---
objects:
  - myfile: DAFile
---
code: |
  plot_file(datapoints, myfile)

然后在你的模块中你可以做类似的事情:

def plot_file(datapoints, the_file):
  the_file.initialize(filename="plot.png")
  ...
  with open(the_file.path(), 'rb') as file_pointer:
    file_pointer.write(data)
  the_file.commit()

请参阅 this section 中的第一个示例。

Docassemble 被设计为基于云的应用程序,因此您不能假设在时间 1 处理请求的机器与在时间 2 处理请求的机器相同。这就是为什么文件是抽象为 DAFile 个对象; DAFile 代码负责将文件存储在 S3 上并从 S3 中检索它。 DAFile class 还提供了一个权限系统,这样服务器上的其他用户就无法访问您的文件,除非您专门调用 .set_attributes().user_access() 来授予权限.