【发布时间】:2019-07-18 23:07:44
【问题描述】:
我试图了解如何将 firestore 本地模拟器用于 python 和测试目的。但我找不到操作方法文档。
有人可以帮我吗?
【问题讨论】:
标签: python google-cloud-platform google-cloud-firestore
我试图了解如何将 firestore 本地模拟器用于 python 和测试目的。但我找不到操作方法文档。
有人可以帮我吗?
【问题讨论】:
标签: python google-cloud-platform google-cloud-firestore
使用firebase_admin python 模块,遵循Cloud Firestore Docs 中记录的标准设置
这将涉及使用credentials 上下文调用initialize_app,然后使用firestore.client() 创建一个传统的Firestore 客户端
例如:
from firebase_admin import credentials, firestore, initialize_app
firebase_credentials_file_path = ...
cred = credentials.Certificate(firebase_credentials_file_path)
initialize_app(cred)
db = firestore.client()
接下来,您需要安装并运行 Firestore Emulator,它将通过 localhost:8080 托管本地 Firestore 实例。
npx firebase setup:emulators:firestore
npx firebase --token $FIREBASE_TOKEN emulators:start --only firestore --project $PROJECT_KEY
最后,在已实例化的firestore.client 实例中注入重定向,以使用不安全的 GRPC 通道与本地模拟器主机/端口进行交互:
import grpc
from google.cloud.firestore_v1.gapic import firestore_client
from google.cloud.firestore_v1.gapic.transports import firestore_grpc_transport
channel = grpc.insecure_channel("localhost:8080")
transport = firestore_grpc_transport.FirestoreGrpcTransport(channel=channel)
db._firestore_api_internal = firestore_client.FirestoreClient(transport=transport)
现在,您的db 对象将毫无问题地与本地模拟器交互。
【讨论】:
grpc 在多处理环境中不起作用。见github.com/googleapis/google-cloud-python/issues/…
grpc 多处理限制的人,请考虑将 multiprocessing.managers.BaseManager 作为外观扩展到进程安全的单例 grpc 实例。
欢迎来到 SO :)
Cloud Firestore 模拟器(目前)的主要目的似乎是测试安全规则,如 here 所记录的那样。 This section 声明:“目前唯一支持模拟器的 SDK 是 Node.js SDK。”
令人困惑的是,还有用于 Google Cloud 客户端库的 these Ruby 文档。 Python 中似乎还没有同样的功能。
Here 是作为 Google Cloud SDK 的一部分运行模拟器的说明。
考虑在数据存储模式下使用 Cloud Firestore,它具有更好的工具(可能只是有更多的时间来成熟)。您可以在 Running the Datastore mode Emulator 页面上找到运行其模拟器的说明。
使用Choosing between Native Mode and Datastore Mode 页面来决定您要采取的方向。如果您觉得需要额外的“本机模式”功能,那么直接连接到云中的真实 Firestore 实例可能是最简单的方法。
【讨论】:
目前,只需设置这两个环境变量,即可将firebase_admin 的任何SDK 连接到firebase 模拟器。我已经在 Python SDK 上亲自测试过它,它就像一个魅力。
export FIRESTORE_EMULATOR_HOST="localhost:8080"
export GCLOUD_PROJECT="any-valid-name"
【讨论】: