如何调用在本地主机上工作的azure函数并在azure门户上返回500?

2024-04-29 04:17:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python在VSCode中创建了一个Azure函数。当我在本地主机上测试AzureWebJob时,API包含对AzureWebJob的访问http://localhost:7071/api/FUNCTIONNAME?Param1=value1 响应为200,JSON返回正常,但是当我将函数部署到Azure时,链接https://APPSERVICENAME.azurewebsites.net/api/FUNCTIONNAME?code=APICODE==&Param1=value1返回500内部服务器错误

我正在使用Postman在Chrome上测试并回答查询

使用的代码是:

import logging
import azure.functions as func
from io import StringIO
import pandas as pd
from datetime import datetime as dt
import json

#filter the dataframe
def filter(pdf, keys, daterange):
  jkeys=[]
  for key in keys:
    #filter by numeric key
    if(reg.isdigit()):
      jkeys.append(int(key))
  #filtering by two types of keys
  pdfA=pdf[pdf['key'].isin(keys)]
  pdfS=pdf[pdf['numerickey'].isin(jkeys)]
  #concat the DFs
  pdf=pd.concat([pdfS,pdfA],axis=0)
  #Filtering by a dateRange or single date
  if(daterange.isdigit()): 
    pdf=pdf[pdf['Day']==int(daterange)]
    return pdf
  else:
    #getting the two dates
    date=daterange.split('-')
    #filtering the rows
    pdf=pdf[(pdf['Day']>=int(date[0])) & (pdf['Day']<=int(date[1]))]
    return pdf

# function to validate the params
def param_validation(param: str,
                    param_name: str,
                    req: func.HttpRequest) -> str:
                    
    if not param:
        try:
            req_body = req.get_json()
        except ValueError:

            if param != None and '-' in param:
                return func.HttpResponse(
                    "Set a date in the query",
                    status_code=400
                )
        else:
            param = req_body.get(param_name)
            return param
    else:
        return param

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

    #get the params
    daterange = req.params.get('daterange')
    keys = req.params.get('keys')
    name=req.params.get('name')

    daterange = param_validation(daterange, 'daterange', req)
    keys = param_validation(keys, 'keys', req)

    #this condition is included just to test fast if works 
    if name:
        return func.HttpResponse(f"Hello {name}!")
    #This is to get the real data request function
    if daterange and (keys):
        try:
            
            if daterange and keys:
                # get the data from a csv in the datalake 
                data = pd.read_csv(StringIO(inputBlob.read().decode('utf-8')))
                keys=keys.split(',')  
                dfFilt=filter(data,keys,daterange).fillna(0)

                return func.HttpResponse(f"{json.dumps(dfFilt.to_dict(orient='record'))}")

            else:
                return func.HttpResponse(
                    "insert a valid daterange to the query",
                    status_code=400
            )
        except:
                return func.HttpResponse(
                    "Params are wrong.",
                    status_code=500
            )
    else:
            return func.HttpResponse(
                "Params missed",
                status_code=400
            )
          

其目的是从datalake获取csv,并返回由提供的2个参数过滤的行

我找到了关于错误的更多信息,平台返回了137个python代码。我使用陈旧的csv(即更轻的60mb)部署了最后一个功能api,该api运行良好。但是当我设置新的csv(300mb)时,api开始返回代码500内部服务器错误

我认为这就是内存问题,因为在本地主机中工作得非常好

是从datalake获取数据的另一种方法,使用azure函数过滤两列吗?还是有可能解决这个内存问题

谢谢


Tags: thenameimportapigetreturnifpdf
1条回答
网友
1楼 · 发布于 2024-04-29 04:17:46

这个问题可能是由许多原因造成的,因此请提供更多详细信息。就我而言,这没有问题

1,参数代码应该是函数的键(如果不是匿名的)

2、请检查您的代码,可能您使用的是不存在的东西。(请显示您的代码和其他文件。)

您可以使用application Insights检查详细信息错误,也可以直接查看日志文件:

转到https://yourfunctionappname.scm.azurewebsites.net/DebugConsole,然后单击LogFiles\Application\Functions\Function\HttpTrigger1>,您将在那里找到日志文件,单击并检查错误

任何更新请让我知道

相关问题 更多 >