Python Firebase Firestore get()快照在第二次查询时冻结
我正在尝试从AWS Elastic Beanstalk部署中访问Firestore。EB应用程序是使用Python中的Flask编写的,所有内容都在本地正常工作。但是,当我尝试部署到EB时,只有第一个数据库请求成功——第二个数据库请求在调用Python Firebase Firestore get()快照在第二次查询时冻结,python,firebase,flask,amazon-elastic-beanstalk,google-cloud-firestore,Python,Firebase,Flask,Amazon Elastic Beanstalk,Google Cloud Firestore,我正在尝试从AWS Elastic Beanstalk部署中访问Firestore。EB应用程序是使用Python中的Flask编写的,所有内容都在本地正常工作。但是,当我尝试部署到EB时,只有第一个数据库请求成功——第二个数据库请求在调用.get()期间冻结了我的应用程序 我不确定这是否是EB上的权限问题,Firestore问题,还是什么!由于没有抛出异常,我甚至无法拒绝请求并继续 我确实在日志中得到了以下信息: [Tue Jun 26 11:29:16.964989 2018][core:e
.get()
期间冻结了我的应用程序
我不确定这是否是EB上的权限问题,Firestore问题,还是什么!由于没有抛出异常,我甚至无法拒绝请求并继续
我确实在日志中得到了以下信息:
[Tue Jun 26 11:29:16.964989 2018][core:error][pid 3914][client 172.31.17.165:22711]返回标题前脚本超时:application.py
。。。但这是因为对.get()
的调用从未返回,脚本正在超时
以下是此测试应用程序的完整代码:
import os
from flask import Flask, url_for, redirect, render_template
import mimetypes
import time
import google
import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore
print("=====================================================")
print("initializing app")
cred = credentials.Certificate("/my/actual/path/to/credentials/is/here.json")
firebase_admin.initialize_app(cred)
print("done.")
print("initializing firestore")
db = firestore.client()
print("done.")
print("initializing flask")
application = Flask(__name__)
print("done.")
@application.route('/doc/<docId>')
def doc(docId):
docId = docId.lower()
documents_ref = db.collection(u'documents')
doc_ref = documents_ref.document(docId)
print("getting doc")
doc = None
try:
doc = doc_ref.get()
except google.cloud.exceptions.NotFound:
print("not found.")
return render_template('doc.html', message="This document no longer exists Ok I finally found the solution to the issue it was here:
AWS Elastic Beanstalk - Script timed out before returning headers: application.py
Create an ebextension file like so and redeploy to fix the issue:
nano .ebextensions/<some_name>.config
#add the following to <some_name>.config
files:
"/etc/httpd/conf.d/wsgi_custom.conf":
mode: "000644"
owner: root
group: root
content: |
WSGIApplicationGroup %{GLOBAL}
#add to git
git add .ebextensions/<some_name>.config
git commit -m 'message here'
#deploy to beanstalk
eb deploy
导入操作系统
从flask导入flask、url\u for、重定向、呈现\u模板
导入模拟类型
导入时间
导入谷歌
导入firebase_管理员
从firebase_管理员导入凭据
从firebase_管理员导入firestore
打印(“===============================================================================”)
打印(“初始化应用程序”)
cred=credentials.Certificate(“/my/actual/path/to/credentials/is/here.json”)
firebase_管理员初始化_应用程序(cred)
打印(“完成”)
打印(“初始化firestore”)
db=firestore.client()
打印(“完成”)
打印(“初始化烧瓶”)
应用=烧瓶(名称)
打印(“完成”)
@application.route(“/doc/”)
def文档(文档ID):
docId=docId.lower()
文档\u ref=db.collection(u'documents')
doc\u ref=文档\u ref.文档(docId)
打印(“获取文档”)
doc=无
尝试:
doc=doc_ref.get()
除了google.cloud.exceptions.NotFound:
打印(“未找到”)
return render_template('doc.html',message=“此文档不再存在Ok我终于找到了问题的解决方案,它就在这里:
像这样创建一个ebextension文件,并重新部署以解决此问题:
nano.ebextensions/.config
#将以下内容添加到.config
文件夹:
“/etc/httpd/conf.d/wsgi_custom.conf”:
模式:“000644”
所有者:root
组:根
内容:|
WSGIApplicationGroup%{GLOBAL}
#添加到git
git add.ebextensions/.config
git提交-m'消息在这里'
#部署到beanstalk
电子商务部署
Beanstalk日志可能会告诉您问题出在哪里。通过控制台,您可以下载完整的捆绑日志并查看其中是否有明显的内容。通过EBCLI,您可以针对相同的内容执行eb日志
。如果日志中没有指示,我建议您将SSH绑定到Beanstalk实例中d在那里手动运行应用程序。我认为您应该在/var/lib/current
下找到该应用程序。日志似乎没有显示任何有趣的内容……错误日志中的最后一条消息是“getting doc”"从脚本开始,直到超时,我才开始做任何事情。我正在尝试找出如何通过SSH连接到实例中手动运行它…我认为python应用程序位于/opt/python/current
,我可以使用flask run
启动它,但我仍在尝试找出如何从外部访问实例以进行测试。好的,我连接到e实例w/eb ssh
、source/opt/python/current/env
、和flask run
,并在端口5000的实例上启动了flask服务器。然后,我使用curl对其进行了测试http://127.0.0.1:5000/doc/test
而且它似乎每次都在那里工作。因此它似乎不是访问外部世界的实例这就是问题所在?或者,当EB运行flask服务器时与我运行flask服务器时有所不同?因此,似乎不是访问外部世界的实例才是问题所在?--很可能是这样。您能否确定与环境相关联的EC2实例是否允许5000上通过其安全组的传入流量您能告诉我您的环境正在使用哪种负载平衡器吗?