Функции Azure в Python: ошибка «Требуется дуплексный режим»

В рамках моей работы по проектированию данных я унаследовал некоторые функции Azure, написанные на Python некоторое время назад. Теперь мне нужно обновить их, чтобы отразить измененные учетные данные, но я продолжаю сталкиваться с проблемами.

При развертывании он запускает приведенный ниже вариант «Дуплексная опция требуется при отправке тела».

Я нашел множество сообщений на SO и других сайтах, в которых рекомендуется добавлять «duplex»: «half» или «duplex true», и это намекает на то, что они каким-то образом связаны с node.js (что, насколько мне известно, мы не используем) . Я также наткнулся на ветку SO, в которой предполагалось, что ошибка может быть вызвана тем, что запрошенный токен не прошел вовремя, и что вызов был асинхронным.

Мне комфортно работать с C#, но я очень новичок в Python, поэтому я надеюсь, что кто-нибудь сможет взглянуть на код и сообщить мне, что/где я могу это исправить, поскольку до сих пор мои попытки не дали никакого результата.

Наш код:

import logging
import pandas as pd
import azure.functions as func
import time
import io
from office365.runtime.auth.authentication_context import AuthenticationContext
from office365.sharepoint.client_context import ClientContext
from office365.sharepoint.files.file import File

class Office():
    '''
    Uses the Office365 API and accesses the the Growth team sharepoint to extract the content
    of a specific file into a pandas dataframe. The extracted datetime is also added to the dataframe
    for uses in the table.

    For now this class only reads in 1 specific file. 
    For future: Make it so it can take any xlsx file in any sharepoint.
    '''
    def __init__(self, Secret):
        self.status_code = 200
        self.site_url = '<%sharepoint site%>'
        username = '<%service principal GUID%>'
        password = str(Secret)
        #Note Points to specific file now. TODO: Update to take any fname from Json.
        self.relative_url = '<%link to file%>'
        app_principal = {  
            'client_id': username,  
            'client_secret': password,  
            }
        try: # setting up connection
            self.context_auth = AuthenticationContext(url = self.site_url)
            self.context_auth.acquire_token_for_app(client_id = app_principal['client_id'], client_secret = app_principal['client_secret'])  
            self.ctx = ClientContext(self.site_url, self.context_auth)
            self.status_code = 200
        except:
            self.status_code = 403

    def getData(self):
        '''
        Reads the file content in a byte stream format.
        Uses the openpyxl to reformat this to be readeble for pandas.
        '''
        if self.status_code != 200:
            return None, self.status_code
        response = File.open_binary(self.ctx, self.relative_url) # gets a byte steam.
        self.status_code = response.status_code
        if self.status_code != 200:
            return pd.DataFrame({'A' : []}), self.status_code #if error returns empty df.
        
        bytes_file_obj = io.BytesIO()
        bytes_file_obj.write(response.content)
        bytes_file_obj.seek(0) #set file object to start
        df = pd.read_excel(bytes_file_obj, engine = 'openpyxl')
        return df, self.status_code

def main(req: func.HttpRequest) -> func.HttpResponse:
    now = time.strftime("%Y-%m-%d-%H:%M:%S") # Get extract time.
    logging.info('Python HTTP trigger function processed a request.')

    ClientSecret = req.params.get('Sharepoint-ClientSecret')
    if not ClientSecret:
        try:
            req_body = req.get_json()
        except ValueError:
            ClientSecret = '<None>'
            pass
        else:
            ClientSecret = req_body.get('value')

    if ClientSecret:
        now = time.strftime("%Y-%m-%d-%H:%M:%S") # Get extract time.
        Of365 = Office(Secret = ClientSecret)
        df, statusCode = Of365.getData()
        # Some error handeling. 
        if statusCode == 403:
            return func.HttpResponse(f"Authentication with secret key failed.\nStatus Code {statusCode}.", status_code = statusCode)
        elif statusCode == 404:
            return func.HttpResponse(f"File not found.\nStatus Code {statusCode}.", status_code = statusCode)
        elif statusCode != 200:
            return func.HttpResponse(f"Sometihng Failed.\nStatus Code {statusCode}", status_code = statusCode)
        else:
            logging.info(
            'Success in connecting to Sharepoint API and generating {0} object class'.format(Office.__class__.__name__))
            Date_Extracted = [now]*df.shape[0] # Created vector with time.
            df ['Date_Extracted'] = Date_Extracted
            return func.HttpResponse(df.to_json(orient = "table"), status_code = 200)
    else:
        return func.HttpResponse(
            "Bad Request: did not get any data.",
            status_code=400
        )

Очистите кэш, перезапустите код Visual Studio и повторите попытку развертывания.

Pravallika KV 05.07.2024 10:59

Здравствуйте, эти библиотеки все новые версии? Или вы можете попытаться очистить кеш, используя ярлык Ctr+Shift+P, чтобы открыть панель команд, и ввести Python: Clear Cache and Reload Window очистить кеш. Затем попробуйте перезагрузить компьютер и посмотрите, поможет ли это.

Jeanneli 05.07.2024 11:27

Большое спасибо за предложение, но это не решило проблему. К сожалению, я получаю то же сообщение об ошибке.

SchmitzIT 05.07.2024 13:04

Это функция Azure Python v1? Обновите код Visual Studio до последней версии.

Pravallika KV 05.07.2024 13:09

@PravallikaKV - я даже не знаю, как проверить версию функции. Я использовал код VS 1.90 и сейчас загружаю последнюю версию (1.91). Я также, согласно предыдущему комментарию Жаннели, обновил расширения до последней версии. Я вернусь, как только установка будет завершена. Спасибо!

SchmitzIT 05.07.2024 13:18

@PravallikaKV - Спасибо! Понятия не имею, почему, но после обновления до 1.91 ошибка исчезла. Развертывание не удалось, но, по крайней мере, это прогресс. Если вы добавите свое предложение в качестве ответа, я отмечу его как решение моей проблемы.

SchmitzIT 05.07.2024 13:35

Пожалуйста, проверьте ответ ниже.

Pravallika KV 05.07.2024 13:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

RequestInit: ошибка «Требуется опция дуплекса»

Эта ошибка может возникнуть из-за несовместимости версий. Чтобы устранить эту ошибку, обновите Visual Studio Code до последней версии, как указано в комментариях.


Я создал функцию Azure Python V1, используя ваш код, и могу развернуть эту функцию в приложении-функции Azure.

локальные.settings.json:

{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "python",
    "AzureWebJobsStorage": "UseDevelopmentStorage=true"
  }
}

требования.txt:

azure-functions
pandas
office365
office365-REST-Python-Client
  • Создано приложение-функция Azure Python 3.11.
  • Развернули функцию в Azure с помощью Visual Studio Code.

Портал:

Другие вопросы по теме

Ошибка авторизации при отправке большого двоичного объекта с управляемой идентификацией
Приложение-функция Azure — нет настройки непрерывного развертывания для плана хостинга «Гибкое потребление»?
Как настроить проверку утверждения конвейера Azure для развертывания в приложениях-функциях Azure?
Как получить доступ к строке подключения с помощью Python
Как полностью остановить локальный запуск функции Azure? Функция Azure [Python V2] продолжает предыдущее выполнение при перезапуске отладчика [VS Code]?
Код ошибки MSB4062 в проекте функции Azure в VS для запуска API Microsoft Graph с функциями Azure
Получение исключения «Невозможно динамически создать экземпляр типа Microsoft.Azure.Functions.Worker.Http.HttpRequestData». в функции Azure
Приложению функции Azure Python не удается импортировать пакеты при развертывании через Azure DevOps
Azure Blob: как автоматизировать преобразование архивного хранилища Azure в холодный/горячий уровень, отправить ссылку для загрузки, как только она станет доступна, и повторно заархивировать через 72 часа?
Код ошибки CS:0021 в проекте функции Azure в VS для запуска API Microsoft Graph с функциями Azure