Use uvicorn

This commit is contained in:
2023-05-14 16:31:03 +02:00
parent 92c2cf7077
commit 7948ba71f6
6 changed files with 40 additions and 76 deletions

View File

@@ -2,18 +2,17 @@ exclude: 'docs|node_modules|migrations|.git|.tox'
repos: repos:
- repo: https://github.com/ambv/black - repo: https://github.com/ambv/black
rev: 22.12.0 rev: 23.3.0
hooks: hooks:
- id: black - id: black
language_version: python3.11 language_version: python3.11
- repo: https://github.com/charliermarsh/ruff-pre-commit - repo: https://github.com/charliermarsh/ruff-pre-commit
rev: 'v0.0.216' rev: 'v0.0.267'
hooks: hooks:
- id: ruff - id: ruff
args: ["--force-exclude"]
- repo: https://github.com/crate-ci/typos - repo: https://github.com/crate-ci/typos
rev: v1.13.6 rev: typos-dict-v0.9.26
hooks: hooks:
- id: typos - id: typos

View File

@@ -6,16 +6,18 @@ import time
from typing import AsyncIterator, Optional from typing import AsyncIterator, Optional
import uuid import uuid
from fastapi import APIRouter, FastAPI, File, Form, HTTPException, UploadFile, status
from fastapi.responses import StreamingResponse
import aiofiles import aiofiles
import aiofiles.os import aiofiles.os
import aiofiles.ospath import aiofiles.ospath
from fastapi import APIRouter, FastAPI, File, Form, HTTPException, UploadFile, status
from fastapi.responses import StreamingResponse
from fastapi_utils.tasks import repeat_every from fastapi_utils.tasks import repeat_every
import sentry_sdk import sentry_sdk
from config import env_config from config import env_config
if env_config.SENTRY_DSN: if env_config.SENTRY_DSN:
sentry_sdk.init( sentry_sdk.init(
env_config.SENTRY_DSN, env_config.SENTRY_DSN,

View File

@@ -39,4 +39,4 @@ COPY ./scripts/healthcheck.py /root/healthcheck.py
EXPOSE 8080 EXPOSE 8080
CMD gunicorn -k uvicorn.workers.UvicornWorker main:app --bind 0.0.0.0:8080 --timeout 600 CMD uvicorn main:app --host 0.0.0.0 --port 8080 --loop uvloop --timeout-keep-alive 600

76
poetry.lock generated
View File

@@ -98,14 +98,14 @@ files = [
[[package]] [[package]]
name = "fastapi" name = "fastapi"
version = "0.95.0" version = "0.95.1"
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "fastapi-0.95.0-py3-none-any.whl", hash = "sha256:daf73bbe844180200be7966f68e8ec9fd8be57079dff1bacb366db32729e6eb5"}, {file = "fastapi-0.95.1-py3-none-any.whl", hash = "sha256:a870d443e5405982e1667dfe372663abf10754f246866056336d7f01c21dab07"},
{file = "fastapi-0.95.0.tar.gz", hash = "sha256:99d4fdb10e9dd9a24027ac1d0bd4b56702652056ca17a6c8721eec4ad2f14e18"}, {file = "fastapi-0.95.1.tar.gz", hash = "sha256:9569f0a381f8a457ec479d90fa01005cfddaae07546eb1f3fa035bc4797ae7d5"},
] ]
[package.dependencies] [package.dependencies]
@@ -225,27 +225,6 @@ files = [
docs = ["Sphinx", "docutils (<0.18)"] docs = ["Sphinx", "docutils (<0.18)"]
test = ["objgraph", "psutil"] test = ["objgraph", "psutil"]
[[package]]
name = "gunicorn"
version = "20.1.0"
description = "WSGI HTTP Server for UNIX"
category = "main"
optional = false
python-versions = ">=3.5"
files = [
{file = "gunicorn-20.1.0-py3-none-any.whl", hash = "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e"},
{file = "gunicorn-20.1.0.tar.gz", hash = "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"},
]
[package.dependencies]
setuptools = ">=3.0"
[package.extras]
eventlet = ["eventlet (>=0.24.1)"]
gevent = ["gevent (>=1.4.0)"]
setproctitle = ["setproctitle"]
tornado = ["tornado (>=0.2)"]
[[package]] [[package]]
name = "h11" name = "h11"
version = "0.12.0" version = "0.12.0"
@@ -336,25 +315,25 @@ test = ["Cython (>=0.29.24,<0.30.0)"]
[[package]] [[package]]
name = "httpx" name = "httpx"
version = "0.23.3" version = "0.24.0"
description = "The next generation HTTP client." description = "The next generation HTTP client."
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "httpx-0.23.3-py3-none-any.whl", hash = "sha256:a211fcce9b1254ea24f0cd6af9869b3d29aba40154e947d2a07bb499b3e310d6"}, {file = "httpx-0.24.0-py3-none-any.whl", hash = "sha256:447556b50c1921c351ea54b4fe79d91b724ed2b027462ab9a329465d147d5a4e"},
{file = "httpx-0.23.3.tar.gz", hash = "sha256:9818458eb565bb54898ccb9b8b251a28785dd4a55afbc23d0eb410754fe7d0f9"}, {file = "httpx-0.24.0.tar.gz", hash = "sha256:507d676fc3e26110d41df7d35ebd8b3b8585052450f4097401c9be59d928c63e"},
] ]
[package.dependencies] [package.dependencies]
certifi = "*" certifi = "*"
httpcore = ">=0.15.0,<0.17.0" httpcore = ">=0.15.0,<0.18.0"
rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} idna = "*"
sniffio = "*" sniffio = "*"
[package.extras] [package.extras]
brotli = ["brotli", "brotlicffi"] brotli = ["brotli", "brotlicffi"]
cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<13)"] cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"]
http2 = ["h2 (>=3,<5)"] http2 = ["h2 (>=3,<5)"]
socks = ["socksio (>=1.0.0,<2.0.0)"] socks = ["socksio (>=1.0.0,<2.0.0)"]
@@ -568,39 +547,21 @@ files = [
{file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
] ]
[[package]]
name = "rfc3986"
version = "1.5.0"
description = "Validating URI References per RFC 3986"
category = "main"
optional = false
python-versions = "*"
files = [
{file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"},
{file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"},
]
[package.dependencies]
idna = {version = "*", optional = true, markers = "extra == \"idna2008\""}
[package.extras]
idna2008 = ["idna"]
[[package]] [[package]]
name = "sentry-sdk" name = "sentry-sdk"
version = "1.17.0" version = "1.22.2"
description = "Python client for Sentry (https://sentry.io)" description = "Python client for Sentry (https://sentry.io)"
category = "main" category = "main"
optional = false optional = false
python-versions = "*" python-versions = "*"
files = [ files = [
{file = "sentry-sdk-1.17.0.tar.gz", hash = "sha256:ad40860325c94d1a656da70fba5a7c4dbb2f6809d3cc2d00f74ca0b608330f14"}, {file = "sentry-sdk-1.22.2.tar.gz", hash = "sha256:5932c092c6e6035584eb74d77064e4bce3b7935dfc4a331349719a40db265840"},
{file = "sentry_sdk-1.17.0-py2.py3-none-any.whl", hash = "sha256:3c4e898f7a3edf5a2042cd0dcab6ee124e2112189228c272c08ad15d3850c201"}, {file = "sentry_sdk-1.22.2-py2.py3-none-any.whl", hash = "sha256:cf89a5063ef84278d186aceaed6fb595bfe67d099298e537634a323664265669"},
] ]
[package.dependencies] [package.dependencies]
certifi = "*" certifi = "*"
urllib3 = {version = ">=1.26.11", markers = "python_version >= \"3.6\""} urllib3 = {version = ">=1.26.11,<2.0.0", markers = "python_version >= \"3.6\""}
[package.extras] [package.extras]
aiohttp = ["aiohttp (>=3.5)"] aiohttp = ["aiohttp (>=3.5)"]
@@ -613,6 +574,7 @@ django = ["django (>=1.8)"]
falcon = ["falcon (>=1.4)"] falcon = ["falcon (>=1.4)"]
fastapi = ["fastapi (>=0.79.0)"] fastapi = ["fastapi (>=0.79.0)"]
flask = ["blinker (>=1.1)", "flask (>=0.11)"] flask = ["blinker (>=1.1)", "flask (>=0.11)"]
grpcio = ["grpcio (>=1.21.1)"]
httpx = ["httpx (>=0.16.0)"] httpx = ["httpx (>=0.16.0)"]
huey = ["huey (>=2)"] huey = ["huey (>=2)"]
opentelemetry = ["opentelemetry-distro (>=0.35b0)"] opentelemetry = ["opentelemetry-distro (>=0.35b0)"]
@@ -631,7 +593,7 @@ tornado = ["tornado (>=5)"]
name = "setuptools" name = "setuptools"
version = "65.5.1" version = "65.5.1"
description = "Easily download, build, install, upgrade, and uninstall Python packages" description = "Easily download, build, install, upgrade, and uninstall Python packages"
category = "main" category = "dev"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
@@ -775,14 +737,14 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
[[package]] [[package]]
name = "uvicorn" name = "uvicorn"
version = "0.21.1" version = "0.22.0"
description = "The lightning-fast ASGI server." description = "The lightning-fast ASGI server."
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "uvicorn-0.21.1-py3-none-any.whl", hash = "sha256:e47cac98a6da10cd41e6fd036d472c6f58ede6c5dbee3dbee3ef7a100ed97742"}, {file = "uvicorn-0.22.0-py3-none-any.whl", hash = "sha256:e9434d3bbf05f310e762147f769c9f21235ee118ba2d2bf1155a7196448bd996"},
{file = "uvicorn-0.21.1.tar.gz", hash = "sha256:0fac9cb342ba099e0d582966005f3fdba5b0290579fed4a6266dc702ca7bb032"}, {file = "uvicorn-0.22.0.tar.gz", hash = "sha256:79277ae03db57ce7d9aa0567830bbb51d7a612f54d6e1e3e92da3ef24c2c8ed8"},
] ]
[package.dependencies] [package.dependencies]
@@ -978,4 +940,4 @@ files = [
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = "^3.11" python-versions = "^3.11"
content-hash = "11c345fd8a8befc3cff372d466f4d677037ee0015f01fa920d5ab107d2bb158c" content-hash = "99802049383d02d30e33a53dedbbf3a76d0ea50fe24b6b450903d5f0d738dac1"

View File

@@ -6,14 +6,13 @@ authors = ["Kurbanov Bulat <kurbanovbul@gmail.com>"]
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = "^3.11" python = "^3.11"
fastapi = "^0.95.0" fastapi = "^0.95.1"
python-multipart = "^0.0.6" python-multipart = "^0.0.6"
aiofiles = "^23.1.0" aiofiles = "^23.1.0"
uvicorn = {extras = ["standard"], version = "^0.21.1"} uvicorn = {extras = ["standard"], version = "^0.22.0"}
httpx = "^0.23.3" httpx = "^0.24.0"
uvloop = "^0.17.0" uvloop = "^0.17.0"
gunicorn = "^20.1.0" sentry-sdk = "^1.22.2"
sentry-sdk = "^1.17.0"
fastapi-utils = "^0.2.1" fastapi-utils = "^0.2.1"
pydantic = "^1.10.7" pydantic = "^1.10.7"
@@ -59,14 +58,15 @@ extend-immutable-calls = ["fastapi.File", "fastapi.Form"]
max-complexity = 15 max-complexity = 15
[tool.ruff.isort] [tool.ruff.isort]
known-first-party = ["core", "app"]
force-sort-within-sections = true force-sort-within-sections = true
# only_sections = true force-wrap-aliases = true
# force_sort_within_sections = true section-order = ["future", "standard-library", "base_framework", "framework_ext", "third-party", "first-party", "local-folder"]
# lines_after_imports = 2 lines-after-imports = 2
# lexicographical = true
# sections = ["FUTURE", "STDLIB", "BASEFRAMEWORK", "FRAMEWORKEXT", "THIRDPARTY", "FIRSTPARTY", "LOCALFOLDER"] [tool.ruff.isort.sections]
# known_baseframework = ["fastapi",] base_framework = ["fastapi",]
# known_frameworkext = ["starlette",] framework_ext = ["starlette"]
[tool.ruff.pyupgrade] [tool.ruff.pyupgrade]
keep-runtime-typing = true keep-runtime-typing = true

View File

@@ -1,5 +1,6 @@
import httpx import httpx
response = httpx.get( response = httpx.get(
"http://localhost:8080/healthcheck", "http://localhost:8080/healthcheck",
) )