在文件系统中存储图像¶
步骤1:配置字节文件系统存储¶
为了避免弄乱我的数据库,并简化文件操作,我不希望它们存储在数据库中。我希望能够为服务器文件系统上的某些文件创建文件实体,在那里可以访问这些文件以获取实体数据。为此,我必须设置一个自定义 BytesFileSystemStorage 保存实际文件内容的文件“data”属性的存储。
由于注册自定义存储的函数需要一个存储库实例作为第一个参数,所以我们必须在服务器启动挂钩中调用它。所以我加入了 cubicweb_sytweb/hooks.py :
from os import makedirs
from os.path import join, exists
from cubicweb.server import hook
from cubicweb.server.sources import storages
class ServerStartupHook(hook.Hook):
__regid__ = 'sytweb.serverstartup'
events = ('server_startup', 'server_maintenance')
def __call__(self):
bfssdir = join(self.repo.config.appdatahome, 'bfss')
if not exists(bfssdir):
makedirs(bfssdir)
print('created', bfssdir)
storage = storages.BytesFileSystemStorage(bfssdir)
storages.set_attribute_storage(self.repo, 'File', 'data', storage)
注解
如何构建钩子的注册表标识符 (__regid__ ):您可以通过使用诸如命名标识符之类的python模块来引入“名称空间”。这对于通常需要新的自定义钩子的钩子特别重要,而不是覆盖/专门化现有钩子,但该概念可以应用于任何应用程序对象。
我们在这里捕获两个事件:“服务器启动”和“服务器维护”。第一个是在常规存储库启动时调用(例如,作为服务器),另一个用于维护任务(如shell或升级)。在这两种情况下,我们都需要存储设备,否则我们会遇到麻烦…
指定给存储的路径是通过UI(或迁移前的数据库)添加文件的位置。
注意,通过这样做,您就不能再编写试图限制文件的查询了。 data 属性。希望我们通常不会在文件的内容上这样做,或者更一般地不会在字节类型的属性上这样做。
现在,如果已经通过Web UI添加了一些照片,则必须迁移现有数据,以便将文件内容存储在文件系统而不是数据库中。有一个迁移命令要执行此操作,让我们在cubicWeb shell中运行它(在现实生活中,您必须将其放入迁移脚本中,正如我们上次看到的那样):
$ cubicweb-ctl shell sytweb_instance
entering the migration python shell
just type migration commands or arbitrary python code and type ENTER to execute it
type "exit" or Ctrl-D to quit the shell and resume operation
>>> storage_changed('File', 'data')
[========================]
就这样。现在,通过Web UI添加的文件将其内容存储在文件系统中,您还可以从文件系统导入文件,如下一部分中所述。
步骤2:将一些数据导入到实例中¶
嘿,我们开始有一些不错的功能,让我们试试这个新网站。例如,如果我有一个“photos/201005wepyrenees”包含特定事件的图片,我可以通过键入以下内容将其导入到我的网站:
$ cubicweb-ctl fsimport -F sytweb_instance photos/201005WePyrenees/
** importing directory /home/syt/photos/201005WePyrenees
importing IMG_8314.JPG
importing IMG_8274.JPG
importing IMG_8286.JPG
importing IMG_8308.JPG
importing IMG_8304.JPG
注解
-f选项意味着应该映射文件夹,因此我的照片将链接到与文件系统文件夹对应的文件夹实体。
让我们看看Web UI:
没什么不同,我看不到新文件夹…但请记住我们的安全模式!默认情况下,文件只能由经过身份验证的用户访问,我将网站视为匿名的,例如,未经身份验证。如果我登录,现在可以看到:
是的,在那里!你会注意到我可以看到一些实体,以及匿名用户不能看到的文件夹和图像。它只是工作而已。 用户界面中的任何地方 由于它是在存储库级别处理的,这要归功于我们的安全模型。
现在,如果我单击最近插入的文件夹,我可以看到
伟大的!文件夹中甚至还有我的照片。我知道给这个文件夹一个更好的名称(前提是我不再打算从它导入,否则已经导入的照片将被重新导入),更改权限,一些图片的标题等…拥有一个好的内容比拥有一个好的网站要困难得多;)
结论¶
我们开始在这里看到我们的存储库的一个高级特性:能够将数据模型的某些部分存储到数据库外部的自定义存储中。目前只有 BytesFileSystemStorage 有,但你可以期待在不久的将来看到更多(或写你自己的!).
另外,我们可以知道开始给我们的网站添加一些漂亮的图片!这个网站并不完美(实际上离它很远),但它是可用的,我们现在可以开始使用它,并在路上改进它。增量立方法:)