我在这样的函数中运行 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) 我尝试了本教程(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) 我们在 EC2 上运行的 Docker 容器内有一个机器学习模型。
我们使用 Cortex.dev 来自动缩放 GPU。
不确定性的是,请求将在call_nextFastAPI 中间件的函数执行过程中挂起。不幸的是,它是不可重现的。
打印Middleware pre-request行被记录,但路径操作函数中的第一个打印语句永远不会被记录。
我们尝试过的事情:
run函数在没有异步的情况下运行bytes作为参数类型 forimage而不是UploadFile这些更改都不能解决挂起问题,但这是性能最高的配置。
这是否意味着问题出在 FastAPI 而不是 Uvicorn?
如果是,什么可能导致 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) 我有一个使用 uvicorn 执行的 FastAPI api 代码。现在我想添加一个队列系统,我认为 Celery 和 Flower 对我来说是很好的工具,因为我的 api 有一些端点使用大量 CPU 并且需要几秒钟的时间来响应。但是,我对添加芹菜有几个问题:
我正在使用 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) 我第一次使用 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) 了解 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) 我检查了 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) 我使用 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.UvicornWorker到gunicorn.conf.py
我正在 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 服务,其中我必须创建一个 FastAPI 休息端点,并且应该在后台运行 2 个调度程序任务。
我们如何在 FastAPI 中实现调度程序?如果不可行,实现这种要求的最佳方法是什么,创建两个服务是正确的方法?
谢谢和问候,阿鲁
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)