簡體   English   中英

如何使用 Azure 函數中的 pymongo 連接到 Cosmos DB

[英]How do I use pymongo from an Azure function to connect to Cosmos DB

我想創建一個帶有 HTTP 觸發器的 azure 函數,然后使用 pymongo 與 Cosmos DB 數據庫進行交互。 當我在本地計算機上運行它時,這工作正常,但從 azure 運行時失敗。 我猜我需要授予 cosmos db 訪問函數應用程序的權限,但我不知道該怎么做。

import logging

import azure.functions as func

import pymongo

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    name = req.params.get('name')
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        return func.HttpResponse(f"Hello, {name}. This HTTP triggered function executed successfully.")
    else:
        uri = "uri provided by cosmos"
        client = pymongo.MongoClient(uri)

        db = client.test
        collection = db.test
        o = collection.find_one()
        return func.HttpResponse(
             f"name is {o['name']}",
             status_code=200
        )

這是錯誤

Exception while executing function: Functions.ycwn Result: Failure
Exception: ServerSelectionTimeoutError: connection closed
Stack:   File "/azure-functions-host/workers/python/3.7/LINUX/X64/azure_functions_worker/dispatcher.py", line 315, in _handle__invocation_request
    self.__run_sync_func, invocation_id, fi.func, args)
  File "/usr/local/lib/python3.7/concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/azure-functions-host/workers/python/3.7/LINUX/X64/azure_functions_worker/dispatcher.py", line 434, in __run_sync_func
    return func(**params)
  File "/home/site/wwwroot/ycwn/__init__.py", line 27, in main
    o = collection.find_one()
  File "/home/site/wwwroot/.python_packages/lib/site-packages/pymongo/collection.py", line 1273, in find_one
    for result in cursor.limit(-1):
  File "/home/site/wwwroot/.python_packages/lib/site-packages/pymongo/cursor.py", line 1156, in next
    if len(self.__data) or self._refresh():
  File "/home/site/wwwroot/.python_packages/lib/site-packages/pymongo/cursor.py", line 1050, in _refresh
    self.__session = self.__collection.database.client._ensure_session()
  File "/home/site/wwwroot/.python_packages/lib/site-packages/pymongo/mongo_client.py", line 1810, in _ensure_session
    return self.__start_session(True, causal_consistency=False)
  File "/home/site/wwwroot/.python_packages/lib/site-packages/pymongo/mongo_client.py", line 1763, in __start_session
    server_session = self._get_server_session()
  File "/home/site/wwwroot/.python_packages/lib/site-packages/pymongo/mongo_client.py", line 1796, in _get_server_session
    return self._topology.get_server_session()
  File "/home/site/wwwroot/.python_packages/lib/site-packages/pymongo/topology.py", line 490, in get_server_session
    None)
  File "/home/site/wwwroot/.python_packages/lib/site-packages/pymongo/topology.py", line 209, in _select_servers_loop
    self._error_message(selector))

想通了這一點。 我需要選中“允許來自公共 Azure 數據中心內的連接”。

宇宙數據庫設置

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM