【发布时间】:2021-09-09 11:17:36
【问题描述】:
我需要检查 Firestore 文档中的布尔值(字段名称为“NewImageRequested”),当该值设置为 True(由另一个应用程序)时,我必须将图片上传到存储中,并设置值恢复为 False。
到目前为止,我一直在这样做:
db_credentials_file = 'local_file.json'
firebase_config = {
'apiKey': "AIzaSyCi2_82wp1txEv6PbmY7TpPJCA-tlKfXnc",
'authDomain': "coachmylife-dev.firebaseapp.com",
'databaseURL': "https://coachmylife-dev.firebaseio.com",
'projectId': "coachmylife-dev",
'storageBucket': "coachmylife-dev.appspot.com",
'messagingSenderId': "317036767832",
'appId': "1:317036767832:web:6a5a4e61f794bd7db6382d",
'measurementId': "G-HGE4Q3R0GM",
'serviceAccount': db_credentials_file
}
firebase_storage = pyrebase.initialize_app(firebase_config)
storage = firebase_storage.storage()
cred = credentials.Certificate(f"{db_credentials_file}")
firebase_data = firebase_admin.initialize_app (cred)
db = firestore.client()
print('Connection initialized')
doc_ref = db.collection(u'CollectionName').document(u'DocumentName')
def main():
doc_watch = doc_ref.on_snapshot(on_snapshot)
while True:
time.sleep(5)
doc_watch.unsubscribe()
def on_snapshot (doc_snapshot, changes, read_time):
for change in changes:
if change.type.name == 'ADDED':
print(f'Document located: {change.document.id}')
elif change.type.name == 'MODIFIED':
doc_ref.update({u'NewImageRequested': False})
print('\tNew image requested, uploading to storage')
storage.child('images/ipcam/upload_test.png').put('non_local_networks.png')
print('\tNew image uploaded')
if __name__ == '__main__':
main()
到目前为止这有效,但我有 2 个问题:
-
每次更改文档的任何部分时都会触发上传,不仅是在“NewImageRequested”从 False 变为 True 时。是否可以只听这个特定的字段?
-
更好的是,我可以仅在“NewImageRequested”从 False 变为 True 时触发上传吗?它现在的工作方式是:
- “NewImageRequested”从 False 切换为 True
- 上传图片
- 'NewImageRequested' 设置为 False
- 检测到另一个变化(真到假)
- 再次上传图片
- 因为 'NewImageRequested' 已经是 False,所以没有更新
如果我可以仅在 False-True 切换发生时触发上传和修改“NewImageRequested”,它将保存上传(没什么大不了的,但我想知道这是否可能)=
【问题讨论】:
标签: python firebase google-cloud-firestore