Redis()如何在flask工厂模式中,只实例化一次,其他地方调用
时间: 2024-02-11 20:06:07 浏览: 83
在 Flask 工厂模式中,我们可以使用 Flask 的应用上下文和全局上下文来实现 Redis 对象的单例模式。
首先,在工厂函数中创建 Redis 对象,并存储在应用上下文中:
```python
from flask import Flask, g
import redis
app = Flask(__name__)
app.config['REDIS_URL'] = 'redis://localhost:6379/0'
def get_redis():
if 'redis' not in g:
g.redis = redis.from_url(app.config['REDIS_URL'])
return g.redis
```
接下来,我们可以在其他地方通过调用 `get_redis()` 函数来获取 Redis 对象,保证只实例化一次:
```python
from flask import Blueprint
from . import get_redis
bp = Blueprint('example', __name__)
@bp.route('/example')
def example():
r = get_redis()
# 使用 Redis 对象进行操作
return 'Hello, world!'
```
在上面的例子中,每次调用 `get_redis()` 函数时,都会从应用上下文中获取 Redis 对象。如果应用上下文中不存在 Redis 对象,就会创建一个新的 Redis 对象并存储在应用上下文中。这样就可以保证 Redis 对象只被实例化一次。
需要注意的是,在使用完 Redis 对象后,需要手动关闭连接:
```python
r = get_redis()
# 使用 Redis 对象进行操作
r.close()
```
或者使用 `with` 语句自动关闭连接:
```python
with get_redis() as r:
# 使用 Redis 对象进行操作
```
这样可以避免连接池被耗尽的问题。
阅读全文