从python云函数和app_initialization调用firestore



我是gcp的新手,我对firebase和gcp之间的集成感到非常困惑。

我有一个firestoredb,里面有一些数据,还有一个python云函数,需要在那里读写数据。

这是我的一个云函数的main.py文件:

import traceback
import firebase
import firebase_admin
from firebase_admin import credentials, firestore



#@firestore.transactional        
def _run(data):
print("Starting transaction. Input data=%s" % data)
db = firestore.client()
doc_ref = db.collection(u'users').document(data['username']).collection(u'groups').document(data['group'])
group_ref = db.collection(u'groups').document(data['group'])
user_ref = db.collection(u'users').document(data['username'])

doc = doc_ref.get()
if doc.exists:
print("user: ", data['username'], ' is already member of the group: ', data['group'])
return
else:
if data['rating'] == "":
data['rating'] = 50
x = {'rating': data['rating'],
'n_games': 0,
'subscription_time_secs': time.time(),
'group_ref': group_ref}
doc_ref.set(x,
merge=True)
group_ref.collection(u'users').document(data['username']).set({'user_ref': user_ref})
return

def run(request):
"""This endpoint is called as:
curl  http://0.0.0.0:8080/post -d '{"username": "luca", "group": "padel_roma", "rating": None}' -H 'Content-Type: application/json'
"""
data = request.get_json()
print("Cloud function called with input ", data)
try:
firebase_admin.initialize_app()
_run(data)
return {'success': True}
except Exception as e:
err = traceback.format_exc()
return {'success': False, 'error': str(err)}

它只是一个http触发的函数,用于读取和写入一些数据到我的firestore数据库。正如您所看到的,它称为firebase_admin.initialize_app()

我对此感到非常困惑。

如果我删除该行,我会得到:ValueError(nValueError: The default Firebase app does not exist. Make sure to initialize the SDK by calling initialize_app()

相反,如果我保留这行,函数在我第一次调用它时会工作,但在第二次尝试时失败,因为它表示已经存在。

  1. 如果我只访问数据库,为什么需要初始化应用程序
  2. 从谷歌云功能访问firestore的正确方式是什么?我感觉这次initialize_app呼叫很慢

每个进程只能初始化一次Firebase Admin SDK。云函数可能会在同一个进程中顺序处理一个函数的多次调用,因此您应该确保initialize_app只为该进程全局调用一次。因此,最简单的方法实际上只是在全局范围内初始化一次。

from firebase_admin import credentials, firestore
firebase_admin.initialize_app()

现在,您可以在函数中使用它,而无需再次担心init。

最新更新