小编Chr*_*ris的帖子

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,如何获取 POST 请求的原始正文?

在同步而非非模式下使用 FastAPI async,我希望能够接收 POST 请求的原始、未更改的正文。

我能找到的所有示例都显示async代码,当我以正常同步方式尝试时,它们request.body()显示为协程对象。

XML当我通过向此端点发布一些内容来测试它时,我得到了一个500 "Internal Server Error".

from fastapi import FastAPI, Response, Request, Body

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

@app.post("/input")
def input_request(request: Request):
    # how can I access the RAW request body here?  
    body = request.body()

    # do stuff with the body here  

    return Response(content=body, media_type="application/xml")
Run Code Online (Sandbox Code Playgroud)

这对于 FastAPI 来说是不可能的吗?

注意:简化的输入请求如下所示:

POST http://127.0.0.1:1083/input
Content-Type: application/xml

<XML>
    <BODY>TEST</BODY>
</XML>
Run Code Online (Sandbox Code Playgroud)

我无法控制输入请求的发送方式,因为我需要替换现有的 SOAP API。

python starlette fastapi

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

使用 uvicorn.run 启动 FastAPI 应用程序时会导致 404 错误响应

FastAPI 和 uvicorn 的新手,但我想知道为什么当我通过从命令行使用 uvicorn 启动它来运行我的“hello world”服务时,它工作正常,但是当从我的服务内部使用“uvicorn.run”方法时,服务启动,但是当我发送 GET 时,我总是得到一个404响应正文为{"detail": "Not Found"}?

这是我的代码:

import uvicorn
from fastapi import FastAPI

app = FastAPI()
uvicorn.run(app, host="127.0.0.1", port=5049)


@app.get("/")
async def root():
    return {"message": "Hello World"}
Run Code Online (Sandbox Code Playgroud)

总是返回 404,如下所示:

# curl http://127.0.0.1:5049/
{"detail":"Not Found"}
Run Code Online (Sandbox Code Playgroud)

我的服务的输出显示:

INFO:     Started server process [28612]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:5049 (Press CTRL+C to quit)
INFO:     127.0.0.1:55446 - "GET / HTTP/1.1" 404 Not Found
Run Code Online (Sandbox Code Playgroud)

如果我注释掉“uvicorn.run”行,然后从命令行启动该服务(在 Windows 10 上运行): …

http-status-code-404 python-3.x fastapi uvicorn

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

FastAPI 显示“msg”:“必填字段”,“类型”:“value_error.missing”

各位晚上好。我正在尝试使用 FastAPI 请求将新用户添加到我的数据库中。当我尝试通过 python 控制台应用程序执行此操作时,FastAPI 向我显示以下消息:

{
     'detail': [
         {
             'loc': ['body', 'nickname'],
             'msg': 'field required',
             'type': 'value_error.missing'
         },
         {
             'loc': ['body', 'password'],
             'msg': 'field required',
             'type': 'value_error.missing'
         },
         {
             'loc': ['body', 'email'],
             'msg': 'field required',
             'type': 'value_error.missing'
         }
    ]
}
Run Code Online (Sandbox Code Playgroud)

但是,当我执行此请求时,/docs一切正常!

这是我的 pydantic 模型:

{
     'detail': [
         {
             'loc': ['body', 'nickname'],
             'msg': 'field required',
             'type': 'value_error.missing'
         },
         {
             'loc': ['body', 'password'],
             'msg': 'field required',
             'type': 'value_error.missing'
         },
         {
             'loc': ['body', 'email'],
             'msg': 'field required',
             'type': 'value_error.missing'
         } …
Run Code Online (Sandbox Code Playgroud)

python pydantic fastapi

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

FastAPI python:如何在后台运行线程?

我正在使用 FastAPI 在 python 中创建一个服务器,并且我想要一个与我的 API 无关的函数,每 5 分钟在后台运行一次(例如从 API 检查内容并根据响应打印内容)

我尝试创建一个运行该函数的线程start_worker,但它不打印任何内容。

有谁知道该怎么做?

def start_worker():
    print('[main]: starting worker...')
    my_worker = worker.Worker()
    my_worker.working_loop() # this function prints "hello" every 5 seconds

if __name__ == '__main__':
    print('[main]: starting...')
    uvicorn.run(app, host="0.0.0.0", port=8000, reload=True)
    _worker_thread = Thread(target=start_worker, daemon=False)
    _worker_thread.start()
Run Code Online (Sandbox Code Playgroud)

python multithreading fastapi uvicorn

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

FastAPI 中的可选查询参数

我不明白FastAPI 中的可选查询参数。它与默认值为 的默认查询参数有何不同None

如上面链接中所述,下面的示例中的可选查询参数arg1与 之间有什么区别?arg2arg2

@app.get("/info/")
async def info(arg1: int = None, arg2: int | None = None):
    return {"arg1": arg1, "arg2": arg2}
Run Code Online (Sandbox Code Playgroud)

python optional-parameters fastapi

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

FastAPI - 如何在路由器内获取应用程序实例?

我想app在我的路由器文件中获取该实例,我该怎么办?

main.py的如下:

# ...
app = FastAPI()
app.machine_learning_model = joblib.load(some_path)
app.include_router(some_router)
# ...
Run Code Online (Sandbox Code Playgroud)

现在我想在some_router的文件中使用app.machine_learning_model,我该怎么办?

python starlette fastapi

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

根据字段的值使用不同的 Pydantic 模型

我有 2 个 Pydantic 型号 (var1var2)。该方法的输入PostExample可以接收第一模型或第二模型的数据。使用Union有助于解决此问题,但在验证过程中,它会引发第一个模型和第二个模型的错误。

如何做到在填写字段时出现错误时,仅针对某个模型返回验证器错误,而不是同时返回两个模型?(如果有帮助的话,可以通过字段A的长度来区分模型)。

主要.py

@app.post("/PostExample")
def postExample(request: Union[schemas.var1, schemas.var2]):
    
    result = post_registration_request.requsest_response()
    return result
  
  
Run Code Online (Sandbox Code Playgroud)

模式.py

class var1(BaseModel):
    A: str
    B: int
    C: str
    D: str
  
  
class var2(BaseModel):
    A: str
    E: int
    F: str
Run Code Online (Sandbox Code Playgroud)

python pydantic fastapi

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

FastAPI StreamingResponse 不使用生成器函数进行流式传输

我有一个相对简单的 FastAPI 应用程序,它接受查询并从 ChatGPT 的 API 流回响应。ChatGPT 正在流回结果,我可以看到它在输入时被打印到控制台。

不工作的是StreamingResponse通过 FastAPI 返回。相反,响应会一起发送。我真的不知道为什么这不起作用。

这是 FastAPI 应用程序代码:

import os
import time

import openai

import fastapi
from fastapi import Depends, HTTPException, status, Request
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from fastapi.responses import StreamingResponse

auth_scheme = HTTPBearer()
app = fastapi.FastAPI()

openai.api_key = os.environ["OPENAI_API_KEY"]


def ask_statesman(query: str):
    #prompt = router(query)
    
    completion_reason = None
    response = ""
    while not completion_reason or completion_reason == "length":
        openai_stream = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[{"role": "user", "content": query}],
            temperature=0.0,
            stream=True,
        )
        for …
Run Code Online (Sandbox Code Playgroud)

python streaming python-requests fastapi openai-api

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

当 *.py 文件以外的文件发生更改时,如何重新加载 FastAPI 应用程序?

我希望我的 FastAPI 应用程序在出现以下情况时重新加载.csv我希望我的 FastAPI 应用程序在同一目录中的文件发生更改

我尝试了以下命令,但它不起作用。

uvicorn main:app --reload --reload-include *.csv
Run Code Online (Sandbox Code Playgroud)

有谁知道这个问题的解决方案?

fastapi uvicorn

13
推荐指数
1
解决办法
7194
查看次数