当前位置: 首页 > 知识库问答 >
问题:

如何使用python连接到CosmosDB仿真器的表存储?

慎俊雄
2023-03-14

我正在本地运行Azure CosmosDB模拟器,我希望使用Python中的表接口。Microsoft提供azure cosmosdb table python sdk以连接到表API[1]。我无法成功连接到模拟器,即使我能够连接到云中的实际CosmosDB帐户。

版本号等:

  • Windows 10
  • Python 3.6(CPython)
  • azure-cosmosdb-table 1.0.5

我用于尝试访问模拟器的代码

import logging
from azure.cosmosdb.table import TableService

from nossl import no_ssl_verification

logging.basicConfig(level=logging.DEBUG)

connection = {
    'AccountName': 'devstoreaccount1',
    # 'AccountEndpoint': 'https://localhost:8081/',
    'AccountKey': 'C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="',
    # 'EndpointSuffix': 'localhost:8081',
    # 'DefaultEndpointsProtocol': 'https',
    'TableEndpoint': 'https://localhost:8081',
}
connection_string = ';'.join('{k}={v}'.format(k=k, v=v) for k, v in connection.items())
print(connection_string)

with no_ssl_verification():
    ts = TableService(
        endpoint_suffix = "https://localhost:8081",
        connection_string= connection_string,
        is_emulated=True)
    ts.create_table('mytable')

上下文管理器禁用SDK使用的请求库中的所有ssl验证。它是从堆栈溢出上的答案复制而来的[5]。

上面的示例代码产生以下错误:

AccountName=devstoreaccount1;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==";TableEndpoint=https://localhost:8081
DEBUG:azure.cosmosdb.table._auth:String_to_sign=POST

application/json
Thu, 18 Apr 2019 13:50:42 GMT
/devstoreaccount1/Tables
INFO:azure.storage.common.storageclient:Client-Request-ID=f52a8b36-61e0-11e9-8fc0-a44cc8cee022 Outgoing request: Method=POST, Path=/Tables, Query={'timeout': None}, Headers={'Content-Type': 'application/json', 'Prefer': 'return-no-content', 'Accept': 'application/json;odata=minimalmetadata', 'DataServiceVersion': '3.0;NetFx', 'MaxDataServiceVersion': '3.0', 'Content-Length': '24', 'x-ms-version': '2018-03-28', 'User-Agent': 'Azure-Storage/1.4.0-None (Python CPython 3.6.4;
Windows 10)', 'x-ms-client-request-id': 'f52a8b36-61e0-11e9-8fc0-a44cc8cee022', 'x-ms-date': 'Thu, 18 Apr 2019 13:50:42 GMT', 'Authorization': 'REDACTED'}.
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): localhost:8081
DEBUG:urllib3.connectionpool:https://localhost:8081 "POST /Tables HTTP/1.1" 400 None
INFO:azure.storage.common.storageclient:Client-Request-ID=f52a8b36-61e0-11e9-8fc0-a44cc8cee022 Receiving Response: Server-Timestamp=Thu, 18 Apr 2019 13:50:42 GMT, HTTP Status Code=400, Message=Bad Request, Headers={'transfer-encoding': 'chunked', 'content-type': 'application/json', 'server': 'Microsoft-HTTPAPI/2.0',
'x-ms-activity-id': '00000000-0000-0000-0000-000000000000', 'x-ms-gatewayversion': 'version=2.2.0.0', 'date': 'Thu, 18 Apr 2019 13:50:42 GMT'}.
INFO:azure.storage.common.storageclient:Client-Request-ID=f52a8b36-61e0-11e9-8fc0-a44cc8cee022 Operation failed: checking if the operation should be retried. Current retry count=0, Server-Timestamp=Thu, 18 Apr 2019 13:50:42 GMT, HTTP status code=400, Exception=Bad Request{"code":"BadRequest","message":"Request url is invalid., Microsoft.Azure.Documents.Common/2.2.0.0"}.
ERROR:azure.storage.common.storageclient:Client-Request-ID=f52a8b36-61e0-11e9-8fc0-a44cc8cee022 Retry policy did not allow for a retry: Server-Timestamp=Thu, 18 Apr 2019 13:50:42 GMT, HTTP status code=400, Exception=Bad Request{"code":"BadRequest","message":"Request url is invalid., Microsoft.Azure.Documents.Common/2.2.0.0"}.
Traceback (most recent call last):
  File "c:/Users/josteb/sandbox/cosmoskvstore/examples.py", line 24, in <module>
    ts.create_table('mytable')
  File "C:\Users\josteb\.virtualenvs\cosmoskvstore-cPSP36p_\lib\site-packages\azure\cosmosdb\table\tableservice.py", line 539, in create_table
    _dont_fail_on_exist(ex)
  File "C:\Users\josteb\.virtualenvs\cosmoskvstore-cPSP36p_\lib\site-packages\azure\storage\common\_error.py", line 88, in _dont_fail_on_exist
    raise error
  File "C:\Users\josteb\.virtualenvs\cosmoskvstore-cPSP36p_\lib\site-packages\azure\cosmosdb\table\tableservice.py", line 536, in create_table
    self._perform_request(request)
  File "C:\Users\josteb\.virtualenvs\cosmoskvstore-cPSP36p_\lib\site-packages\azure\cosmosdb\table\tableservice.py", line 1106, in _perform_request
    return super(TableService, self)._perform_request(request, parser, parser_args, operation_context)
  File "C:\Users\josteb\.virtualenvs\cosmoskvstore-cPSP36p_\lib\site-packages\azure\storage\common\storageclient.py", line 430, in _perform_request
    raise ex
  File "C:\Users\josteb\.virtualenvs\cosmoskvstore-cPSP36p_\lib\site-packages\azure\storage\common\storageclient.py", line 358, in _perform_request
    raise ex
  File "C:\Users\josteb\.virtualenvs\cosmoskvstore-cPSP36p_\lib\site-packages\azure\storage\common\storageclient.py", line 344, in _perform_request
    HTTPError(response.status, response.message, response.headers, response.body))
  File "C:\Users\josteb\.virtualenvs\cosmoskvstore-cPSP36p_\lib\site-packages\azure\storage\common\_error.py", line 115, in _http_error_handler
    raise ex
azure.common.AzureHttpError: Bad Request
{"code":"BadRequest","message":"Request url is invalid., Microsoft.Azure.Documents.Common/2.2.0.0"}

我无法在任何地方找到正确记录的模拟器要使用的连接参数。模拟器的Web界面提供了帐户名称和帐户密钥。其余的都是一些猜测,这是我通过实验得出的。如果没有这些额外的参数,我可以从日志输出中看到SDK正在尝试联系远程主机(可能是基于云的Cosmos服务的一部分),这当然失败了。is_emulated标志也是如此;当False时,连接到远程主机。

为了查看模拟器是否有问题,我尝试将azure cosmos SDK用于cosmosdb的SQL/document接口来访问模拟器。这在以下代码中运行良好:

from azure.cosmos.cosmos_client import CosmosClient

cc = CosmosClient('https://localhost:8081', auth={'masterKey': 'C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=='})
cc.CreateDatabase({'id': 'mydb'})

这项工作顺利完成,我可以在Emulator的数据资源管理器中看到数据库已经创建。

是否有人可以参考CosmosDB emulator的表接口的正确连接字符串?

[1]https://docs.microsoft.com/en-us/python/api/azure-cosmosdb-table/?view=azure-python

[2]https://docs.microsoft.com/en-us/python/api/azure-cosmos/?view=azure-python

[3]https://docs.microsoft.com/en-us/azure/cosmos-db/local-emulator-export-ssl-certificates

[4]https://bugs.python.org/issue28547

[5] 如何在Python请求中禁用安全证书检查

共有1个答案

周麒
2023-03-14

在python SDK中为表存储禁用证书验证的一种方法

在深入调试了create_table函数后,我发现您可以在请求包中的session.py中验证属性。

默认值为True,可以将其设置为False以跳过SSL验证。

验证证书的方法

另一个名为cert的属性,可以配置为cert路径。

此外,请参阅本文档中的建议和此ssl配置链接。

 类似资料:
  • translated_page: https://github.com/PX4/Devguide/blob/master/en/simulation/ros_interface.md translated_sha: 95b39d747851dd01c1fe5d36b24e59ec865e323e ROS仿真接口 模拟自驾仪会在端口14557开放第二个MAVLink接口。将MAVROS连接到这个端口

  • 我正在尝试通过python访问Azure表存储。 按老办法走查https://docs.microsoft.com/en-us/azure/cosmos-db/table-storage-how-to-use-python#install-the-azure-storage-sdk-for-python 但是它特别为Azure表(https://github.com/Azure/azure-sto

  • 当尝试使用 MongoDB 连接字符串 mongodb 连接到 Azure CosmosDB 的本地模拟器,我收到以下错误: 我已从Microsoft下载中心安装了最新版本的模拟器(当前为v2.4.5),并按照Microsoft文档的安装说明进行了操作 我尝试过使用Mongoose connect with Node.js(与Azure云配置完美配合)进行连接,并使用VS代码Azure Cosmo

  • 我试图将我的NodeJs应用程序与本地主机中的CosmosDb模拟器连接起来: 由于在我的 azure 资源组中,我创建了一个类 MongoDB 的 cosmodb 实例 我使用以下连接字符串在本地主机中进行测试: mongodb://localhost:C2y6yDjf5/Rob0N8A7Cgv30VRDJIWEHLM 4qdu5de2nq9nduvtqobd4b8mgypmbiznqymsec

  • 在我的本地开发环境中,我使用Firebase模拟器进行托管、Firestore和其他功能。 我习惯于在开发过程中使用与其他人共享链接。在开发过程中,我还使用它在移动设备上进行测试。 以下是脚本: 它可以很好地重定向到我的dev域主机,即。 但是,当您通过不同的设备(即:不同的PC或移动设备)访问此链接时,模拟器服务将不可用。 显然,包正在寻找那些仅在我的本地环境中运行的模拟器。 这种情况下的解决方

  • 错误:模拟器:错误:使用相同的AVD运行多个模拟器是一个实验特性。请使用-read-only标志启用此功能。