Elasticsearch 配置
将 Elasticsearch 集成到本应用是展现 Flask 魅力的绝佳范例。 这是一个与 Flask 没有任何关系的服务和 Python 包,然而,我将从配置开始将它们恰如其分地集成,我先在 app.config
模块中实现这样的操作:
config.py :Elasticsearch 配置。
class Config(object):
# ...
ELASTICSEARCH_URL = os.environ.get('ELASTICSEARCH_URL')
与许多其他配置条目一样,Elasticsearch 的连接 URL 将来自环境变量。 如果变量未定义,我将设置其为 None
,并将其用作禁用 Elasticsearch 的信号。 这主要是为了方便起见,所以当你运行应用时,尤其是在运行单元测试时,不必强制 Elasticsearch 服务启动和运行。 因此,为了确保服务的可用性,我需要直接在终端中定义 ELASTICSEARCH_URL
环境变量,或者将它添加到 .env 文件中,如下所示:
ELASTICSEARCH_URL=http://localhost:9200
使用 Elasticsearch 面临着非 Flask 插件如何使用的挑战。 我不能像在上面的例子中那样在全局范围内创建 Elasticsearch 实例,因为要初始化它,我需要访问 app.config
,它必须在调用 create_app()
函数后才可用。 所以我决定在应用程序工厂函数中为 app
实例添加一个 elasticsearch
属性:
app/__init__.py
:Elasticsearch 实例。
# ...
from elasticsearch import Elasticsearch
# ...
def create_app(config_class=Config):
app = Flask(__name__)
app.config.from_object(config_class)
# ...
app.elasticsearch = Elasticsearch([app.config['ELASTICSEARCH_URL']]) \
if app.config['ELASTICSEARCH_URL'] else None
# ...
为 app 实例添加一个新属性可能看起来有点奇怪,但是 Python 对象在结构上并不严格,可以随时添加新属性。 你也可以考虑另一种方法,就是定义一个从 Flask
派生的子类(可以叫 Microblog
),然后在它的 __init__()
函数中定义 elasticsearch
属性。
请留意我设计的 条件表达式 ,如果 Elasticsearch 服务的 URL 在环境变量中未定义,则赋值 None
给 app.elasticsearch
。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论