相关疑难解决方法(0)

FastAPI 以串行方式而不是并行方式运行 api 调用

我有以下代码:

import time
from fastapi import FastAPI, Request
    
app = FastAPI()
    
@app.get("/ping")
async def ping(request: Request):
        print("Hello")
        time.sleep(5)
        print("bye")
        return {"ping": "pong!"}
Run Code Online (Sandbox Code Playgroud)

如果我在本地主机上运行我的代码 - 例如http://localhost:8501/ping- 在同一浏览器窗口的不同选项卡中,我得到:

Hello
bye
Hello
bye
Run Code Online (Sandbox Code Playgroud)

代替:

Hello
Hello
bye
bye
Run Code Online (Sandbox Code Playgroud)

我已经阅读过有关使用的内容httpx,但仍然无法实现真正​​的并行化。有什么问题?

python asynchronous concurrent-processing python-asyncio fastapi

50
推荐指数
1
解决办法
4万
查看次数

如何使用 FastAPI 返回 JSON 格式的 csv 文件/Pandas DataFrame?

我有一个.csv文件想要在 FastAPI 应用程序中呈现。我只设法.csv以 JSON 格式呈现文件,如下所示:

def transform_question_format(csv_file_name):

    json_file_name = f"{csv_file_name[:-4]}.json"

    # transforms the csv file into json file
    pd.read_csv(csv_file_name ,sep=",").to_json(json_file_name)

    with open(json_file_name, "r") as f:
        json_data = json.load(f)

    return json_data

@app.get("/questions")
def load_questions():

    question_json = transform_question_format(question_csv_filename)

    return question_json
Run Code Online (Sandbox Code Playgroud)

当我尝试直接返回时pd.read_csv(csv_file_name ,sep=",").to_json(json_file_name),它起作用了,因为它返回一个字符串。

我应该如何进行?我相信这不是一个好方法。

python csv dataframe pandas fastapi

12
推荐指数
1
解决办法
1万
查看次数

如何在FastAPI中的HTTP请求之间共享变量?

HTTP如何在 FastAPI 的请求之间共享变量值?例如,我有一个POST请求,其中我获取一些音频文件,然后将它们的信息转换为 Pandas Dataframe。我想在请求Dataframe中发送它GET,但我无法访问Dataframe请求GET范围。

@app.post(
    path="/upload-audios/",
    status_code=status.HTTP_200_OK
)
async def upload_audios(audios: list[UploadFile] = File(...)):
    filenames = [audio.filename for audio in audios]
    audio_data = [audio.file for audio in audios]
    new_data = []
    final_data = []
    header = ["name", "file"]
    for i in range(len(audios)):
        new_data = [filenames[i], audio_data[i]]
        final_data.append(new_data)
    new_df = pd.DataFrame(final_data, columns=header)
    return f"You have uploaded {len(audios)} audios which names are: {filenames}"

@app.get("/get-dataframe/")
async def get_dataframe():
    pass
Run Code Online (Sandbox Code Playgroud)

python httprequest starlette fastapi

11
推荐指数
1
解决办法
1万
查看次数

跨多个工作人员共享 python 对象

我们已经使用 FastAPI 创建了一个服务。当我们的服务启动时,它会创建一些 Python 对象,然后端点使用这些对象来存储或检索数据。

生产中的 FastAPI 从多个工人开始。我们的问题是每个工人创建自己的对象而不是共享一个

下面的脚本显示了我们正在做的(简化的)示例,尽管在我们的例子中 Meta() 的使用要复杂得多。

from fastapi import FastAPI, status

class Meta:
   def __init__(self):
      self.count = 0  

app = FastAPI()

meta = Meta()

# increases the count variable in the meta object by 1
@app.get("/increment")
async def increment():
    meta.count += 1
    return status.HTTP_200_OK

# returns a json containing the current count from the meta object
@app.get("/report")
async def report():
    return {'count':meta.count}

# resets the count in the meta object to 0
@app.get("/reset") …
Run Code Online (Sandbox Code Playgroud)

python asynchronous python-asyncio fastapi

9
推荐指数
4
解决办法
3151
查看次数

使用fastapi上传文件

我根据官方文档使用fastapi上传文件,就像:

@app.post("/create_file/")
async def create_file(file: UploadFile=File(...)):
      file2store = await file.read()
      # some code to store the BytesIO(file2store) to the other database
Run Code Online (Sandbox Code Playgroud)

当我使用 python requests lib 发送请求时:

f = open(".../file.txt", 'rb')
files = {"file": (f.name, f, "multipart/form-data")}
requests.post(url="SERVER_URL/create_file", files=files)
Run Code Online (Sandbox Code Playgroud)

file2store 始终为空。有时(很少见),它可以获取文件字节,但几乎所有时间都是空的,所以我无法在另一个数据库上恢复文件。我还尝试了 'bytes' 而不是 'UploadFile',我得到了相同的结果。我的代码有什么地方不对,还是我使用fastapi上传文件的方式有问题?我google了很长时间,但没有成功。所以我在这里提出问题,希望知道答案的人可以帮助我。谢谢

python file-upload fastapi

8
推荐指数
2
解决办法
2万
查看次数

FastAPI UploadFile 与 Flask 相比慢

我创建了一个端点,如下所示:

@app.post("/report/upload")
def create_upload_files(files: UploadFile = File(...)):
        try:
            with open(files.filename,'wb+') as wf:
                wf.write(file.file.read())
                wf.close()
        except Exception as e:
            return {"error": e.__str__()}
Run Code Online (Sandbox Code Playgroud)

它是用 uvicorn 启动的:

../venv/bin/uvicorn test_upload:app --host=0.0.0.0 --port=5000 --reload
Run Code Online (Sandbox Code Playgroud)

我正在执行一些测试,使用 Python 请求上传大约100 MB的文件,大约需要 128 秒:

../venv/bin/uvicorn test_upload:app --host=0.0.0.0 --port=5000 --reload
Run Code Online (Sandbox Code Playgroud)

我使用 Flask 通过 API 端点测试了相同的上传脚本,大约需要 0.5 秒:

f = open(sys.argv[1],"rb").read()
hex_convert = binascii.hexlify(f)
items = {"files": hex_convert.decode()}
start = time.time()
r = requests.post("http://192.168.0.90:5000/report/upload",files=items)
end = time.time() - start
print(end)
Run Code Online (Sandbox Code Playgroud)

我做错了什么吗?

python upload file-upload starlette fastapi

7
推荐指数
1
解决办法
9998
查看次数

使用 FastAPI 和 JS fetch 上传 .csv

我的应用程序在前端使用 React,在后端使用 FastAPI。

我正在尝试将 csv 文件上传到我的服务器。

提交表单时,这会被调用:

  const onSubmit = async (e) => {
    e.preventDefault();
    const formData = new FormData();
    formData.append("file", file);
    fetch("/api/textitems/upload", {
      method: "POST",
      body: formData,
    });
  };
Run Code Online (Sandbox Code Playgroud)

数据由以下人员接收:

@app.post('/api/textitems/upload')
def upload_file(csv_file: UploadFile = File(...)):
    dataframe = pd.read_csv(csv_file.file)
    return dataframe.head()
Run Code Online (Sandbox Code Playgroud)

我不断收到INFO: 127.0.0.1:0 - "POST /api/textitems/upload HTTP/1.1" 422 Unprocessable Entity错误。

我能够使用curl 成功执行post 请求,如下所示:

curl -X POST "http://localhost:8000/api/textitems/upload" -H "accept: application/json" -H "Content-Type: multipart/form-data" -F "csv_file=@exp_prod.csv;type=text/csv"

关于我在使用 Javascript 时出错的地方有什么建议吗?

javascript python csv reactjs fastapi

5
推荐指数
1
解决办法
5004
查看次数

如何在 FastAPI 中上传 CSV 文件并将其转换为 JSON?

我正在尝试将.csv文件上传到 FastAPI 服务器,然后将其转换为 JSON 并将其返回给客户端。但是,当我尝试直接处理它(而不将其存储在某处)时,我收到此错误:

Error : FileNotFoundError: [Error 2] No such file or directory : "testdata.csv"
Run Code Online (Sandbox Code Playgroud)

这是我的 FastAPI 代码:

async def upload(file: UploadFile = File(...)):
    data = {}    
    with open(file.filename,encoding='utf-8') as csvf:
        csvReader = csv.DictReader(csvf)
        for rows in csvReader:             
            key = rows['No']
            data[key] = rows    
    return {data}```

Run Code Online (Sandbox Code Playgroud)

python csv upload fastapi csvtojson

5
推荐指数
2
解决办法
2万
查看次数

如何在不使用外部库(例如 Numpy、Pandas)的情况下读取 CSV 文件?

这是面试中经常出现的问题。

我知道如何使用 .csv 文件读取 csv 文件Pandas

但是,我正在努力寻找一种无需使用外部库即可读取文件的方法。

Python 是否带有任何有助于读取 csv 文件的模块?

python csv excel dataframe pandas

4
推荐指数
1
解决办法
2万
查看次数

熊猫中几个数据帧的异步“read_csv”-为什么不更快

我想创建一个异步读取多个 Pandas 数据帧的代码,例如从 CSV 文件(或从数据库)

我编写了以下代码,假设它应该更快地导入两个数据帧,但它似乎执行得更慢:

import timeit

import pandas as pd
import asyncio

train_to_save = pd.DataFrame(data={'feature1': [1, 2, 3],'period': [1, 1, 1]})
test_to_save = pd.DataFrame(data={'feature1': [1, 4, 12],'period': [2, 2, 2]})

train_to_save.to_csv('train.csv')
test_to_save.to_csv('test.csv')


async def run_async_train():
    return pd.read_csv('train.csv')

async def run_async_test():
    return pd.read_csv('test.csv')

async def run_train_test_asinc():
    df = await asyncio.gather(run_async_train(), run_async_test())
    return df

start_async = timeit.default_timer()
async_train,async_test=asyncio.run(run_train_test_asinc())
finish_async = timeit.default_timer()
time_to_run_async=finish_async-start_async

start = timeit.default_timer()
train=pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
finish = timeit.default_timer()
time_to_run_without_async = finish - start

print(time_to_run_async<time_to_run_without_async)
Run Code Online (Sandbox Code Playgroud)

为什么它在非异步版本中读取两个数据帧的速度更快?

只是为了清楚起见,我真的要从中读取数据, …

python async-await pandas

3
推荐指数
1
解决办法
1669
查看次数