В рамках моей работы по проектированию данных я унаследовал некоторые функции 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
)
Здравствуйте, эти библиотеки все новые версии? Или вы можете попытаться очистить кеш, используя ярлык Ctr+Shift+P
, чтобы открыть панель команд, и ввести Python: Clear Cache and Reload Window
очистить кеш. Затем попробуйте перезагрузить компьютер и посмотрите, поможет ли это.
Большое спасибо за предложение, но это не решило проблему. К сожалению, я получаю то же сообщение об ошибке.
Это функция Azure Python v1? Обновите код Visual Studio до последней версии.
@PravallikaKV - я даже не знаю, как проверить версию функции. Я использовал код VS 1.90 и сейчас загружаю последнюю версию (1.91). Я также, согласно предыдущему комментарию Жаннели, обновил расширения до последней версии. Я вернусь, как только установка будет завершена. Спасибо!
@PravallikaKV - Спасибо! Понятия не имею, почему, но после обновления до 1.91 ошибка исчезла. Развертывание не удалось, но, по крайней мере, это прогресс. Если вы добавите свое предложение в качестве ответа, я отмечу его как решение моей проблемы.
Пожалуйста, проверьте ответ ниже.
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
Портал:
Очистите кэш, перезапустите код Visual Studio и повторите попытку развертывания.