如何在Nameko依赖提供者中使用Config?MongoDB依赖配置获取方法
如何在Nameko中为自定义MongoDB依赖提供者获取配置?
这是个很典型的Nameko依赖注入时机问题,我来帮你理清楚问题所在和解决办法:
问题根源
你现在的写法是在服务类的属性声明阶段直接调用config.get()来初始化MongoDBDP,但这个时机太早了:
- 类属性的赋值是Python加载类的时候就执行的,此时Nameko还没有创建服务实例,也没有完成
Config依赖的注入 - 这时候的
config只是一个空的依赖占位符,还没有被填充实际的配置值,自然无法通过get()获取到host和port
解决方案1:让MongoDB依赖提供者自身依赖Config
最优雅的方式是修改你的MongoDBDP,让它自己依赖Config,在依赖提供者的get_dependency方法中获取配置——这个方法是在服务实例上下文里执行的,此时依赖注入已经完成:
from nameko.dependencies import DependencyProvider, inject from pymongo import MongoClient from nameko.config import Config class MongoDBDP(DependencyProvider): # 让依赖提供者本身注入Config依赖 config = inject(Config()) def get_dependency(self, worker_ctx): # 此时self.config已经被填充了实际配置 host = self.config.get('mongodb_host') # 建议用更明确的配置键名 port = self.config.get('mongodb_port', 27017) # 可以设置默认值 # 初始化MongoDB客户端并返回 return MongoClient(host, port)
然后在服务中直接声明这个依赖即可,不需要传参数:
from nameko.rpc import rpc from nameko.config import Config class SampleService: name = "sample" config = Config() db = MongoDBDP() # 内部会自动从Config获取配置 @rpc def get(self, user_id): # 现在可以正常使用self.db操作MongoDB了 user = self.db.users.find_one({"_id": user_id}) return {'user_id': user_id, 'user_data': user}
解决方案2:在服务的setup方法中初始化依赖
如果不想修改MongoDBDP的实现,也可以利用Nameko服务的setup方法——这个方法会在依赖注入完成后、服务开始处理请求前执行,此时可以安全访问self.config:
from nameko.rpc import rpc from nameko.config import Config class SampleService: name = "sample" config = Config() db = None # 先占位 def setup(self): # setup阶段self.config已经可用 host = self.config.get('host') port = self.config.get('port') self.db = MongoDBDP(host, port) @rpc def get(self, user_id): return {'user_id': user_id, 'db_connection': str(self.db)}
额外建议
- 配置键名尽量更具体(比如
mongodb_host而非host),避免和其他服务的配置冲突 - 在获取配置时设置默认值,提高代码的健壮性(比如
config.get('mongodb_port', 27017))
内容的提问来源于stack exchange,提问作者Alireza
相关产品推荐
相关产品推荐

