如何访问全局服务对象(注入式)?

时间:2019-05-10 07:44:43

标签: python flask

我对flask比较陌生,但是标题的意思是我想创建一个可以在所有控制器或服务中使用的服务对象。

在Java(春季)中,我将创建一个@Bean

@Configuration
public class WhateverGatewayBeans {

    @Value("{whatever.api.key}")
    public String apiKey;

    @Bean
    public WhateverGateway getWhateverGateway() {
        return new WhateverGateway(apiKey)
    }
}

我现在可以在所有@Service中使用它:

@Service
public class AnyService {

    private final WhateverGateway whateverGateway;

    @Autowired // Using injection
    public AnyService(WhateverGateway whateverGateway) {
        this.whateverGateway = whateverGateway;
    }

    public Something getSomethingFromWhatever(String param) {
        return this.whateverGateway.getSomething(param);
    }
}

依此类推

@Controller
public class AnyController {

    private final AnyService anyService;

    @Autowired
    public AnyController(AnyService anyService) {
        this.anyService = anyService;
    }

    @RequestMapping(name = "/api/whatever")
    public Something getSomething(@QueryParam("param") String param) {
        return this.anyService.getSomething(param);
    }
}
  

请注意,以上代码是即时编写的,可能并非100%正确,但您可以理解

我正在Flask中寻找类似的东西:

@app.route('/api/something')
def get_something(whatever_gateway):
    param = request.args.get('param')
    return whatever_gateway.get_something_from_whatever(param)

在这里,whatever_gateway应该在服务器启动期间完全初始化。想象一下它必须加载一段时间,在whatever_gateway准备就绪之前服务器不应该启动。

1 个答案:

答案 0 :(得分:0)

通常,您在模块级别实例化网关:

# gateways.py
whatever_gateway = WhateverGateway()

然后导入:

from gateways import whatever_gateway

@app.route('/api/something')
def get_something(whatever_gateway):
    param = request.args.get('param')
    return whatever_gateway.get_something_from_whatever(param)

但是,还有其他一些用于依赖项注入的解决方案,或者您可以自己滚动。我做了一次,这很容易。但是后来我意识到,大多数时候您只需要使用上面显示的模块即可。

如果要花一些时间实例化网关,则可以通过将其包装在某种工厂中来延迟应用程序的启动时间:

gateway = None

def get_gateway():
    global gateway
    if not gateway:
        gateway = WhateverGateway()
    return gateway