标签: uvicorn

如何使用 fastapi 日志记录捕获 X-Forwarded-For?

我在这样的函数中运行 FastApi 和 guvicorn:

if __name__ == "__main__":

    uvicorn.run(
        app="app.main:app",
        host="HOSTIP",
        port=8000,
        reload=True,
        # log_config=None,
        log_config=log_config,
        log_level="info"
    )
Run Code Online (Sandbox Code Playgroud)

这就是我的 log_config 的样子:

log_config = {
    "version": 1,
    "disable_existing_loggers": True,
    "formatters": {
        "default": {
            "()": "uvicorn.logging.DefaultFormatter",
            "fmt": "%(asctime)s::%(levelname)s::%(name)s::%(filename)s::%(funcName)s - %(message)s",
            "use_colors": None,
        },
        "access": {
            "()": "uvicorn.logging.AccessFormatter",
            "fmt": '%(asctime)s::%(levelprefix)s %(client_addr)s - "%(request_line)s" %(status_code)s',
        },
    },
    "handlers":
    {
        "default":
        {
            "formatter": "default",
            # "class": 'logging.NullHandler',
            "class": 'logging.FileHandler',
            "filename": CONFIG[SECTION]["default"]
        },
        "error":
        {
            "formatter": "default",
            # "class": 'logging.NullHandler',
            "class": 'logging.FileHandler',
            "filename": CONFIG[SECTION]["error"]
        },
        "access": …
Run Code Online (Sandbox Code Playgroud)

haproxy python-3.x fastapi uvicorn

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

使用 UVICORN 启用 https

我尝试了本教程(https://dev.to/rajshirolkar/fastapi-over-https-for-development-on-windows-2p7d),然后当我进入浏览器但无法使用 https 访问我的本地主机地址时,如果我尝试使用 http,它可以工作,但我需要使用 HTTPS。

这是我尝试过的代码:

import uvicorn

if __name__ == "__main__":
    uvicorn.run("app.api:app",
                 host="localhost",
                 port=8432, 
                 reload=True,
                 ssl_keyfile="./key.pem", 
                 ssl_certfile="./cert.pem")
Run Code Online (Sandbox Code Playgroud)

python fastapi uvicorn

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

中间件中调用call_next(路径操作函数)期间FastAPI/Unvicorn请求挂起

我们在 EC2 上运行的 Docker 容器内有一个机器学习模型。

我们使用 Cortex.dev 来自动缩放 GPU。

不确定性的是,请求将在call_nextFastAPI 中间件的函数执行过程中挂起。不幸的是,它是不可重现的。

打印Middleware pre-request行被记录,但路径操作函数中的第一个打印语句永远不会被记录。

我们尝试过的事情:

  • 与 1 名工人一起运行 Uvicorn
  • run函数在没有异步的情况下运行
  • 运行 withbytes作为参数类型 forimage而不是UploadFile

这些更改都不能解决挂起问题,但这是性能最高的配置。

  1. 这是否意味着问题出在 FastAPI 而不是 Uvicorn?

  2. 如果是,什么可能导致 FastAPI 挂起?如果不是,问题出在哪里以及如何解决?

Dockerfile

FROM nvidia/cuda:11.4.0-runtime-ubuntu18.04

WORKDIR /usr/src/app

RUN apt-get -y update && \
    apt-get install -y --fix-missing \
    build-essential \
    cmake \
    python3 \
    python3-pip \
    ffmpeg \
    libsm6 \
    libxext6 \
    && apt-get clean && rm -rf /tmp/* /var/tmp/*

ADD ./requirements.txt …
Run Code Online (Sandbox Code Playgroud)

python python-requests fastapi uvicorn

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

Celery、uvicorn 和 FastAPI

我有一个使用 uvicorn 执行的 FastAPI api 代码。现在我想添加一个队列系统,我认为 Celery 和 Flower 对我来说是很好的工具,因为我的 api 有一些端点使用大量 CPU 并且需要几秒钟的时间来响应。但是,我对添加芹菜有几个问题:

  1. 芹菜可以代替 Uvicorn 吗?我还需要它吗?我在网站上看不到任何他们也考虑 uvicorn 的例子,当你执行 Celery 时似乎不需要它......
  2. 我读过很多关于使用 Celery 为 FastAPI 创建队列的内容。但是,您可以在 FastAPI 中管理队列,而无需使用 Celery。什么更好?为什么?

python api celery fastapi uvicorn

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

fastapi 日志记录错误并且 swagger 不起作用

我正在使用 fastapi 制作一个 REST API。

我只是想知道为什么每当我执行服务器时都会收到以下消息。

INFO:     Started server process [97154]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
--- Logging error ---
Traceback (most recent call last):
  File "/usr/lib/python3.10/logging/__init__.py", line 1100, in emit
    msg = self.format(record)
  File "/usr/lib/python3.10/logging/__init__.py", line 943, in format
    return fmt.format(record)
  File "/usr/lib/python3.10/logging/__init__.py", line 678, in format
    record.message = record.getMessage()
  File "/usr/lib/python3.10/logging/__init__.py", line 368, in getMessage
    msg = msg % self.args
TypeError: %d format: a real number is required, not str
Call stack:
  File "mYlOcAtIoN/src/main.py", …
Run Code Online (Sandbox Code Playgroud)

python rest backend fastapi uvicorn

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

浏览器 Cookie 永不过期

我第一次使用 HTTpOnly Cookie 实现登录身份验证就我而言,当用户使用 fastapi 和 uvicorn 在Python 服务中调用登录方法时创建 cookie 。

我已经阅读了MDN文档来实现 expires 属性,因此,浏览器会在时间到期时删除此 cookie。

我已经使用 http.cookies 和Morsel在 Python 中实现了 Cookie,以应用HttpOnly属性,如下所示:

from http import cookies
from fastapi import FastAPI, Response, Cookie, Request
from fastapi.responses import HTMLResponse, FileResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates

mytoken = 'blablabla'

def getUtcDate():
    sessionDate = datetime.now()
    sessionDate += timedelta(minutes=2)
    return sessionDate.strftime('%a, %d %b %Y %H:%M:%S GMT')

@app.get('cookietest')
def getCookie(response: Response):
   cookie = cookies.Morsel()
   cookie['httponly'] …
Run Code Online (Sandbox Code Playgroud)

cookies python-3.x cookie-httponly fastapi uvicorn

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

Uvicorn / Fastapi 如何处理 1 个工作线程和同步端点的并发?

了解 Uvicorn 异步行为

我试图了解 Uvicorn 的行为。我创建了一个示例 fastapi 应用程序,主要休眠 5 秒。

import time
from datetime import datetime


from fastapi import FastAPI


app = FastAPI()

counter = 0

@app.get("/")
def root():
    global counter
    counter = counter + 1
    my_id = counter
    print(f'I ({my_id}) am feeling sleepy')
    time.sleep(5)
    print(f'I ({my_id}) am done sleeping')
    return {}
Run Code Online (Sandbox Code Playgroud)

我使用 Apache Bench 的以下命令调用我的应用程序:

ab -n 5 -c 5 http://127.0.0.1:8000/
Run Code Online (Sandbox Code Playgroud)

输出:

I (1) am feeling sleepy  -- 0s
I (1) am done sleeping   -- 5s
I (2) am …
Run Code Online (Sandbox Code Playgroud)

python python-asyncio fastapi uvicorn

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

当 uvicorn 工作人员> 1 时,uvicorn 和 fastAPI 与 pyinstaller 问题

我检查了 PyInstaller 和 FastAPI(超出最大递归深度)并且 Pyinstaller 编译的 Uvicorn 服务器无法正确启动

FastAPI 演示main.py

import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def root():
    return {"hello": "world"}

if __name__ == '__main__':
    uvicorn.run(app, host="0.0.0.0", port=58000, reload=False)
Run Code Online (Sandbox Code Playgroud)

首先运行 pyinstallerpyinstaller -F main.py --clean并添加hidden_imports规范:

hidden_imports=[
                'uvicorn.logging',
                'uvicorn.loops',
                'uvicorn.loops.auto',
                'uvicorn.protocols',
                'uvicorn.protocols.http',
                'uvicorn.protocols.http.auto',
                'uvicorn.protocols.websockets',
                'uvicorn.protocols.websockets.auto',
                'uvicorn.lifespan',
                'uvicorn.lifespan.on',
            ]
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但是当工人大于 1 时,应用程序必须是字符串:

WARNING: You must pass the application as an import string to enable 'reload' or 'workers'.

所以我改为:

if __name__ == '__main__': …
Run Code Online (Sandbox Code Playgroud)

python pyinstaller fastapi uvicorn

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

如何在gunicorn conf文件中指定uvicorn工人

我使用 Gunicorn 运行 Django 应用程序:gunicorn -c gunicorn.conf.py config.wsgi

## gunicorn.conf.py:

from os import environ

bind = '0.0.0.0:' + environ.get('PORT', '8000')
workers = environ.get('WORKERS', 8)
loglevel = 'info'
graceful_timeout = 300
Run Code Online (Sandbox Code Playgroud)

现在我用gunicorn + uvicorn运行它gunicorn -c gunicorn.conf.py config.asgi -k uvicorn.workers.UvicornWorker

我想将添加-k uvicorn.workers.UvicornWorkergunicorn.conf.py

django gunicorn uvicorn

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

如何在公开端口的 docker 容器中运行 uvicorn?

我正在 windows/ubuntu 中的 docker 容器内开发 fastapi (代码如下)。当我通过在终端中运行python -m uvicorn app:app --reload测试容器外部的应用程序时,然后导航到127.0.0.1:8000/home一切正常:

{
  Data: "Test"
}
Run Code Online (Sandbox Code Playgroud)

但是,当我docker-compose up时,我既无法在容器中运行python -m uvicorn app:app --reload(由于端口已被使用),也无法在浏览器中看到任何返回的内容。我尝试过 127.0.0.1:8000/home、host.docker.internal:8000/home 和 localhost:8000/home 并且我总是收到:

{
   detail: "Not Found"
}
Run Code Online (Sandbox Code Playgroud)

我缺少哪一步?

Dockerfile:

FROM python:3.8-slim

EXPOSE 8000

ENV PYTHONDONTWRITEBYTECODE=1

ENV PYTHONUNBUFFERED=1

COPY requirements.txt .
RUN python -m pip install -r requirements.txt

WORKDIR /app
COPY . /app

RUN adduser -u nnnn --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser

CMD ["gunicorn", …
Run Code Online (Sandbox Code Playgroud)

python docker fastapi uvicorn

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

如何在fastapi(uvicorn服务器)中创建调度程序

我正在开发一项 python 服务,其中我必须创建一个 FastAPI 休息端点,并且应该在后台运行 2 个调度程序任务。

我们如何在 FastAPI 中实现调度程序?如果不可行,实现这种要求的最佳方法是什么,创建两个服务是正确的方法?

谢谢和问候,阿鲁

python scheduler fastapi uvicorn

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

Django Channels ASGI - AppRegistryNotReady:应用程序尚未加载

python manage.py runserver使用通道 asgi 开发服务器运行我的项目可以完美地启动它,但是当使用 Daphne ( daphne project.routing:application)运行项目时,我收到错误AppRegistryNotReady: Apps aren't loaded yet

settings.py

INSTALLED_APPS = [
    'channels',
    'whitenoise.runserver_nostatic',
    'django.contrib.staticfiles',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.sites',
    # ...
    # ... installed apps and custom apps
]

WSGI_APPLICATION = 'project.wsgi.application'

ASGI_APPLICATION = 'project.routing.application'

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [REDIS_URL],
        }
    },
}
Run Code Online (Sandbox Code Playgroud)

routing.py

import os

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter

from django.core.asgi import get_asgi_application
from django.conf.urls import url …
Run Code Online (Sandbox Code Playgroud)

django django-channels daphne asgi uvicorn

0
推荐指数
1
解决办法
1148
查看次数