我有一个金字塔API,基本上有三层。
服务是每个外部API的类,其中将包含身份验证数据之类的内容。这应该是一个类属性,因为它不会随每个实例更改。但是,我不知道如何使它成为一个类属性。
相反,我在视图request.registry.settings
中提取设置,将其传递给控制器,然后控制器将其向下传递给服务的init()。这似乎是不必要的。
显然,我可以用代码对它们进行硬编码,但这是一个糟糕的主意。
还有更好的方法吗?
金字塔本身不使用全局变量,这是当您要求设置在类级别或模块级别的属性中可用时的要求。对于实例级的东西,您只需从视图或配置中将金字塔的设置传递到实例中即可。
要解决此问题,您始终可以在配置时将Pyramid应用程序的数据传递到模型中。例如,在main
中,只需拉settings = config.get_settings()
并将其中的一些传递到需要的位置即可。通常,您要尝试一次在配置时传递信息,而不是一直从视图层传递信息。
最后,在不使用类级别或模块级别属性的情况下,执行此操作的一种好方法是在应用程序中注册服务的实例。 pyramid_services库提供了一种解决方案,但其基本思想是为您的应用实例化服务实例,将其添加到金字塔注册表config.registry.foo = ...
中,然后您可以传递设置。稍后在您的查看代码中,您可以使用request.registry.foo
从那里获取服务,并且已经为您设置了!