我已经定义了一个名为 File 的新 Column 类型,它应该让我只将文件名存储在数据库中。然后我会将实际文件存储在根+子文件夹+名称的文件系统中。
File(root, subfolder="", max_length=100, **kwargs)
我遇到的问题是我想在 PasteDeploy 配置文件中定义根。如何在运行时定义它以便我可以访问配置?
我已经定义了一个名为 File 的新 Column 类型,它应该让我只将文件名存储在数据库中。然后我会将实际文件存储在根+子文件夹+名称的文件系统中。
File(root, subfolder="", max_length=100, **kwargs)
我遇到的问题是我想在 PasteDeploy 配置文件中定义根。如何在运行时定义它以便我可以访问配置?
为什么不避免自定义列类型的复杂性,只将文件路径存储为列,并提供一些可以为您加载文件数据的属性或混合属性?
class Data(Base):
path = Column(String)
def myview(request):
data = Data(path='foo')
root_path = request.registry.settings['data_root']
with open(os.path.join(root_path, data.path), 'rb') as fp:
file_data = fp.read()
# ...
显然,如果您愿意,您可以将其中的一些功能包装到 Data 的方法中。
无论如何,访问 INI 设置的方法是以下之一:
request.registry.settings
。pyramid.threadlocal.get_current_request()
,您可以获取设置。对我来说,这听起来像你的架构需要更多的思考。即使您实现了自定义列类型,该类型仍然必须映射到您的引擎支持的 SQL 列类型。对于文件夹和文件名,这是最自然的两varchar
列。那么为什么不在你的类中使用两个字段,andpath
呢?filename
String(256)
至于可配置的根,这听起来像是您想指定与path
此根的相对关系,以便您只能在一个地方更改它。在数据库中拥有大部分配置,除了存储在配置文件中的一件事,对我来说是一种代码味道。我认为最好让根成为其他配置表中的列,并使用 aForeignKey
以这种方式引用根。