【问题标题】:Unable to use Cloud NDB in local flask python3 environment with google app engine无法在带有谷歌应用引擎的本地烧瓶 python3 环境中使用 Cloud NDB
【发布时间】:2020-11-05 16:52:02
【问题描述】:

我正在尝试在 Windows 10 下使用谷歌应用引擎开发 python3 烧瓶应用。我使用谷歌云 NDB 作为我的数据库。但是当我按照教程添加这样的实体时:

from google.cloud import ndb

client = ndb.Client(namespace='main')
class Contact(ndb.Model):
    name = ndb.StringProperty()
    phone = ndb.StringProperty()
    email = ndb.StringProperty()
app = Flask(__name__)

@app.route('/')
def root():
    with client.context():
        contact1 = Contact(name="John Smith",
                           phone="555 617 8993",
                           email="john.smith@gmail.com")
        contact1.put()
        people=Contact.query().fetch()[0].name
        print(people)

本地烧瓶应用程序页面 127.0.0.1/8080 无法加载,我不断收到以下错误:

Traceback (most recent call last):
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\flask\app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\flask\app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\flask\app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\flask\app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\flask\app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\flask\app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\sunha\Desktop\building-an-app-1\main.py", line 33, in root
    contact1.put()
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\google\cloud\ndb\_options.py", line 89, in wrapper
    return wrapped(*pass_args, **kwargs)
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\google\cloud\ndb\utils.py", line 78, in wrapper
    return wrapped(*args, **new_kwargs)
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\google\cloud\ndb\utils.py", line 110, in positional_wrapper
    return wrapped(*args, **kwds)
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\google\cloud\ndb\model.py", line 4935, in _put
    return self._put_async(_options=kwargs["_options"]).result()
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\google\cloud\ndb\tasklets.py", line 190, in result
    self.check_success()
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\google\cloud\ndb\tasklets.py", line 137, in check_success
    raise self._exception
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\google\cloud\ndb\tasklets.py", line 309, in _advance_tasklet
    self.generator.throw(type(error), error, traceback)
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\google\cloud\ndb\model.py", line 4996, in put
    ds_key = yield _datastore_api.put(ds_entity, kwargs["_options"])
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\google\cloud\ndb\tasklets.py", line 309, in _advance_tasklet
    self.generator.throw(type(error), error, traceback)
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\google\cloud\ndb\_datastore_api.py", line 409, in put
    key_pb = yield batch.put(entity_pb)
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\google\cloud\ndb\tasklets.py", line 312, in _advance_tasklet
    yielded = self.generator.send(send_value)
  File "C:\Users\sunha\Desktop\env\Lib\site-packages\google\cloud\ndb\_retry.py", line 84, in retry_wrapper
    raise core_exceptions.RetryError(
google.api_core.exceptions.RetryError: Maximum number of 3 retries exceeded while calling <function make_call.<locals>.rpc_call at 0x04DFBBF8>, last exception: <_MultiThreadedRendezvous of RPC that terminated with:
    status = StatusCode.UNAVAILABLE
    details = "failed to connect to all addresses"
    debug_error_string = "{"created":"@1594873007.440000000","description":"Failed to pick `subchannel","file":"src/core/ext/filters/client_channel/client_channel.cc","file_line":3941,"referenced_errors":[{"created":"@1594873007.440000000","description":"failed to connect to all addresses","file":"src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc","file_line":393,"grpc_status":14}]}"`

然后我尝试了 gcloud app deploy,一切都在生产环境中运行。我检查了我的在线数据存储页面,并在加载应用程序时成功添加了实体。有谁知道为什么它在我的本地环境中不起作用?在运行应用程序之前,我已经运行了包含“Flask==1.1.2 google-cloud-ndb”的 pip install -r requirements.txt。我使用 python main.py 运行该应用程序。谢谢!

【问题讨论】:

  • 你在本地运行Datastore Emulator吗?
  • 我当时没有运行 Datastore 模拟器,所以它不起作用。但是现在我有了,它不再给我那个错误了。谢谢!
  • 太棒了!我将其添加为答案。

标签: python google-app-engine flask google-cloud-platform google-cloud-datastore


【解决方案1】:

您需要在本地运行 Datastore Emulator

【讨论】:

  • 有没有办法改用生产数据存储?我创建了一个服务帐户并生成了一个凭证 json 文件,添加到我的环境变量中但没有成功,我每次都收到 503 错误。
猜你喜欢
  • 2020-10-12
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多