首页 > 解决方案 > python 在库中包装并从函数调用时请求为空?

问题描述

这个错误已经杀死了我一个星期,但我认为我已将其缩小为一种我无法解释的奇怪行为。对于这个冗长的问题,我很抱歉,但我会尽量说清楚。

我正在使用快速 API,并且我有一个这样的端点:

@app.get("/company/{tickers}/dosomething")
async def dosomething(tickers):
  query_statement = f""" 
  select *
  from mytable
  where ticker in { *tickers* }
  """

  #main_db_instance is a module I wrote to wrap my db connect via asyncpg.
  result_data = await main_db_instance.fetch_rows(query_statement)
  return jsonable_encoder(result_data)

以上工作完美!如果您直接调用它,它会起作用。

然后我更进一步,创建了一个简单的库,让用户更轻松地访问数据

def requestCompanyReturning(ticker, endpoint):
  r = requests.get(f'myurl.com/company/{*ticker*}/{*endpoint*}', *headers*={'Authorization': f'{config.api_key}'})
  df = pd.read_json(r.content)
  return df



def dosomething(ticker):
  df = requestCompanyReturning(*ticker*, "dosomething") #calls above function to get data
  return df

 
dosomething(‘ibm’)

这在直接调用和我将库提供给用户访问时有效。到目前为止一切正常。

我的用户开始使用该库来构建一些很酷的东西,它可以在他们的机器和笔记本上完美运行。

我拿了他们的代码并添加了一个新的 fastapi 端点:

@app.get("/company/{tickers}/dosomethingEvenCooler")
async def dosomethingcooler(tickers):
  var = dosomething(‘ibm’)
  var = #something even cooler than above happens here! Hold on to your hats!
  …

  return jsonable_encoder(var)

出于某种原因,并非总是如此,但此时 var 为空。这让我发疯,但并非总是如此。如果我在它下面添加一个打印语句,或者睡眠,它就不会那么频繁了。

感觉完全是随机的,所以我无法找出原因,但如果我为 500 个数据点运行一个循环,很多会失败,但我再次运行它,一个完全不同的集合会失败。

当我查看时,似乎当我在我的快速 API 应用程序中调用我的 requestCompanyReturning 库调用的请求是空的。它在我们的机器、colab notebooks 和其他任何地方都可以正常工作,但是在应用程序中调用时它是空的。

有人有什么主意吗?

我检查了日志,没有看到任何与通话失败相关的错误。事实上,我确实看到了来自请求的调用,即使它失败/之后是空的。

标签: pythonpython-asynciofastapi

解决方案


推荐阅读