├── .gitignore ├── Dockerfile ├── README.md ├── app ├── main.py └── worker │ ├── celery_app.py │ └── celery_worker.py ├── docker-compose-services.yml ├── docker-compose.yml ├── poetry.lock └── pyproject.toml /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/visualstudiocode 3 | # Edit at https://www.gitignore.io/?templates=visualstudiocode 4 | 5 | ### VisualStudioCode ### 6 | .vscode/* 7 | .vscode 8 | !.vscode/settings.json 9 | !.vscode/tasks.json 10 | !.vscode/launch.json 11 | !.vscode/extensions.json 12 | 13 | ### VisualStudioCode Patch ### 14 | # Ignore all local history of files 15 | .history 16 | 17 | # End of https://www.gitignore.io/api/visualstudiocode 18 | 19 | # Created by https://www.gitignore.io/api/macos 20 | # Edit at https://www.gitignore.io/?templates=macos 21 | 22 | ### macOS ### 23 | # General 24 | .DS_Store 25 | .AppleDouble 26 | .LSOverride 27 | 28 | # Icon must end with two \r 29 | Icon 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear in the root of a volume 35 | .DocumentRevisions-V100 36 | .fseventsd 37 | .Spotlight-V100 38 | .TemporaryItems 39 | .Trashes 40 | .VolumeIcon.icns 41 | .com.apple.timemachine.donotpresent 42 | 43 | # Directories potentially created on remote AFP share 44 | .AppleDB 45 | .AppleDesktop 46 | Network Trash Folder 47 | Temporary Items 48 | .apdisk 49 | 50 | # End of https://www.gitignore.io/api/macos 51 | 52 | # Created by https://www.gitignore.io/api/linux 53 | # Edit at https://www.gitignore.io/?templates=linux 54 | 55 | ### Linux ### 56 | *~ 57 | 58 | # temporary files which can be created if a process still has a handle open of a deleted file 59 | .fuse_hidden* 60 | 61 | # KDE directory preferences 62 | .directory 63 | 64 | # Linux trash folder which might appear on any partition or disk 65 | .Trash-* 66 | 67 | # .nfs files are created when an open file is removed but is still being accessed 68 | .nfs* 69 | 70 | # End of https://www.gitignore.io/api/linux 71 | 72 | # Created by https://www.gitignore.io/api/windows 73 | # Edit at https://www.gitignore.io/?templates=windows 74 | 75 | ### Windows ### 76 | # Windows thumbnail cache files 77 | Thumbs.db 78 | ehthumbs.db 79 | ehthumbs_vista.db 80 | 81 | # Dump file 82 | *.stackdump 83 | 84 | # Folder config file 85 | [Dd]esktop.ini 86 | 87 | # Recycle Bin used on file shares 88 | $RECYCLE.BIN/ 89 | 90 | # Windows Installer files 91 | *.cab 92 | *.msi 93 | *.msix 94 | *.msm 95 | *.msp 96 | 97 | # Windows shortcuts 98 | *.lnk 99 | 100 | # End of https://www.gitignore.io/api/windows 101 | 102 | # Created by https://www.gitignore.io/api/python 103 | # Edit at https://www.gitignore.io/?templates=python 104 | 105 | ### Python ### 106 | # Byte-compiled / optimized / DLL files 107 | __pycache__/ 108 | *.py[cod] 109 | *$py.class 110 | 111 | # C extensions 112 | *.so 113 | 114 | # Distribution / packaging 115 | .Python 116 | build/ 117 | develop-eggs/ 118 | dist/ 119 | downloads/ 120 | eggs/ 121 | .eggs/ 122 | lib/ 123 | lib64/ 124 | parts/ 125 | sdist/ 126 | var/ 127 | wheels/ 128 | pip-wheel-metadata/ 129 | share/python-wheels/ 130 | *.egg-info/ 131 | .installed.cfg 132 | *.egg 133 | MANIFEST 134 | 135 | # PyInstaller 136 | # Usually these files are written by a python script from a template 137 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 138 | *.manifest 139 | *.spec 140 | 141 | # Installer logs 142 | pip-log.txt 143 | pip-delete-this-directory.txt 144 | 145 | # Unit test / coverage reports 146 | htmlcov/ 147 | .tox/ 148 | .nox/ 149 | .coverage 150 | .coverage.* 151 | .cache 152 | nosetests.xml 153 | coverage.xml 154 | *.cover 155 | .hypothesis/ 156 | .pytest_cache/ 157 | 158 | # Translations 159 | *.mo 160 | *.pot 161 | 162 | # Django stuff: 163 | *.log 164 | local_settings.py 165 | db.sqlite3 166 | 167 | # Flask stuff: 168 | instance/ 169 | .webassets-cache 170 | 171 | # Scrapy stuff: 172 | .scrapy 173 | 174 | # Sphinx documentation 175 | docs/_build/ 176 | 177 | # PyBuilder 178 | target/ 179 | 180 | # Jupyter Notebook 181 | .ipynb_checkpoints 182 | 183 | # IPython 184 | profile_default/ 185 | ipython_config.py 186 | 187 | # pyenv 188 | .python-version 189 | 190 | # pipenv 191 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 192 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 193 | # having no cross-platform support, pipenv may install dependencies that don’t work, or not 194 | # install all needed dependencies. 195 | #Pipfile.lock 196 | 197 | # celery beat schedule file 198 | celerybeat-schedule 199 | 200 | # SageMath parsed files 201 | *.sage.py 202 | 203 | # Environments 204 | .env 205 | .venv 206 | env/ 207 | venv/ 208 | ENV/ 209 | env.bak/ 210 | venv.bak/ 211 | 212 | # Spyder project settings 213 | .spyderproject 214 | .spyproject 215 | 216 | # Rope project settings 217 | .ropeproject 218 | 219 | # mkdocs documentation 220 | /site 221 | 222 | # mypy 223 | .mypy_cache/ 224 | .dmypy.json 225 | dmypy.json 226 | 227 | # Pyre type checker 228 | .pyre/ 229 | 230 | # End of https://www.gitignore.io/api/python 231 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:latest 2 | 3 | LABEL maintainer="Grega Vrbančič Minimal example utilizing FastAPI and Celery with RabbitMQ for task queue, Redis for Celery backend and flower for monitoring the Celery tasks. 4 | 5 | ## Requirements 6 | 7 | - Docker 8 | - [docker-compose](https://docs.docker.com/compose/install/) 9 | 10 | ## Run example 11 | 12 | 1. Run command ```docker-compose up```to start up the RabbitMQ, Redis, flower and our application/worker instances. 13 | 2. Navigate to the [http://localhost:8000/docs](http://localhost:8000/docs) and execute test API call. You can monitor the execution of the celery tasks in the console logs or navigate to the flower monitoring app at [http://localhost:5555](http://localhost:5555) (username: user, password: test). 14 | 15 | ## Run application/worker without Docker? 16 | 17 | ### Requirements/dependencies 18 | 19 | - Python >= 3.7 20 | - [poetry](https://python-poetry.org/docs/#installation) 21 | - RabbitMQ instance 22 | - Redis instance 23 | 24 | > The RabbitMQ, Redis and flower services can be started with ```docker-compose -f docker-compose-services.yml up``` 25 | 26 | ### Install dependencies 27 | 28 | Execute the following command: ```poetry install --dev``` 29 | 30 | ### Run FastAPI app and Celery worker app 31 | 32 | 1. Start the FastAPI web application with ```poetry run hypercorn app/main:app --reload```. 33 | 2. Start the celery worker with command ```poetry run celery worker -A app.worker.celery_worker -l info -Q test-queue -c 1``` 34 | 3. Navigate to the [http://localhost:8000/docs](http://localhost:8000/docs) and execute test API call. You can monitor the execution of the celery tasks in the console logs or navigate to the flower monitoring app at [http://localhost:5555](http://localhost:5555) (username: user, password: test). -------------------------------------------------------------------------------- /app/main.py: -------------------------------------------------------------------------------- 1 | import os 2 | import logging 3 | from threading import Thread 4 | 5 | from fastapi import FastAPI, BackgroundTasks 6 | 7 | from worker.celery_app import celery_app 8 | 9 | log = logging.getLogger(__name__) 10 | 11 | app = FastAPI() 12 | 13 | 14 | def celery_on_message(body): 15 | log.warn(body) 16 | 17 | def background_on_message(task): 18 | log.warn(task.get(on_message=celery_on_message, propagate=False)) 19 | 20 | 21 | @app.get("/{word}") 22 | async def root(word: str, background_task: BackgroundTasks): 23 | task_name = None 24 | 25 | # set correct task name based on the way you run the example 26 | if not bool(os.getenv('DOCKER')): 27 | task_name = "app.worker.celery_worker.test_celery" 28 | else: 29 | task_name = "app.app.worker.celery_worker.test_celery" 30 | 31 | task = celery_app.send_task(task_name, args=[word]) 32 | print(task) 33 | background_task.add_task(background_on_message, task) 34 | 35 | return {"message": "Word received"} 36 | -------------------------------------------------------------------------------- /app/worker/celery_app.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from celery import Celery 4 | 5 | celery_app = None 6 | 7 | if not bool(os.getenv('DOCKER')): # if running example without docker 8 | celery_app = Celery( 9 | "worker", 10 | backend="redis://:password123@localhost:6379/0", 11 | broker="amqp://user:bitnami@localhost:5672//" 12 | ) 13 | celery_app.conf.task_routes = { 14 | "app.worker.celery_worker.test_celery": "test-queue"} 15 | else: # running example with docker 16 | celery_app = Celery( 17 | "worker", 18 | backend="redis://:password123@redis:6379/0", 19 | broker="amqp://user:bitnami@rabbitmq:5672//" 20 | ) 21 | celery_app.conf.task_routes = { 22 | "app.app.worker.celery_worker.test_celery": "test-queue"} 23 | 24 | celery_app.conf.update(task_track_started=True) 25 | -------------------------------------------------------------------------------- /app/worker/celery_worker.py: -------------------------------------------------------------------------------- 1 | from time import sleep 2 | 3 | from celery import current_task 4 | 5 | from .celery_app import celery_app 6 | 7 | 8 | @celery_app.task(acks_late=True) 9 | def test_celery(word: str) -> str: 10 | for i in range(1, 11): 11 | sleep(1) 12 | current_task.update_state(state='PROGRESS', 13 | meta={'process_percent': i*10}) 14 | return f"test task return {word}" 15 | -------------------------------------------------------------------------------- /docker-compose-services.yml: -------------------------------------------------------------------------------- 1 | version: "3.7" 2 | 3 | services: 4 | rabbitmq: 5 | image: "bitnami/rabbitmq:3.7" 6 | ports: 7 | - "4369:4369" 8 | - "5672:5672" 9 | - "25672:25672" 10 | - "15672:15672" 11 | volumes: 12 | - "rabbitmq_data:/bitnami" 13 | 14 | redis: 15 | image: "bitnami/redis:5.0.4" 16 | environment: 17 | - REDIS_PASSWORD=password123 18 | ports: 19 | - "6379:6379" 20 | volumes: 21 | - "redis_data:/bitnami/redis/data" 22 | 23 | celery-flower: 24 | image: gregsi/latest-celery-flower-docker:latest 25 | environment: 26 | - AMQP_USERNAME=user 27 | - AMQP_PASSWORD=bitnami 28 | - AMQP_ADMIN_USERNAME=user 29 | - AMQP_ADMIN_PASSWORD=bitnami 30 | - AMQP_HOST=rabbitmq 31 | - AMQP_PORT=5672 32 | - AMQP_ADMIN_HOST=rabbitmq 33 | - AMQP_ADMIN_PORT=15672 34 | - FLOWER_BASIC_AUTH=user:test 35 | ports: 36 | - "5555:5555" 37 | depends_on: 38 | - rabbitmq 39 | - redis 40 | 41 | volumes: 42 | rabbitmq_data: 43 | driver: local 44 | redis_data: 45 | driver: local -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.7" 2 | 3 | services: 4 | rabbitmq: 5 | image: "bitnami/rabbitmq:3.7" 6 | ports: 7 | - "4369:4369" 8 | - "5672:5672" 9 | - "25672:25672" 10 | - "15672:15672" 11 | volumes: 12 | - "rabbitmq_data:/bitnami" 13 | 14 | redis: 15 | image: "bitnami/redis:5.0.4" 16 | environment: 17 | - REDIS_PASSWORD=password123 18 | ports: 19 | - "6379:6379" 20 | volumes: 21 | - "redis_data:/bitnami/redis/data" 22 | 23 | celery-flower: 24 | image: gregsi/latest-celery-flower-docker:latest 25 | environment: 26 | - AMQP_USERNAME=user 27 | - AMQP_PASSWORD=bitnami 28 | - AMQP_ADMIN_USERNAME=user 29 | - AMQP_ADMIN_PASSWORD=bitnami 30 | - AMQP_HOST=rabbitmq 31 | - AMQP_PORT=5672 32 | - AMQP_ADMIN_HOST=rabbitmq 33 | - AMQP_ADMIN_PORT=15672 34 | - FLOWER_BASIC_AUTH=user:test 35 | ports: 36 | - "5555:5555" 37 | depends_on: 38 | - rabbitmq 39 | - redis 40 | 41 | fastapi: 42 | build: . 43 | ports: 44 | - "8000:8000" 45 | depends_on: 46 | - rabbitmq 47 | - redis 48 | volumes: 49 | - "./:/app" 50 | command: "poetry run hypercorn app/app/main:app --bind 0.0.0.0:8000 --reload" 51 | 52 | worker: 53 | build: . 54 | depends_on: 55 | - rabbitmq 56 | - redis 57 | volumes: 58 | - "./:/app" 59 | command: "poetry run celery -A app.app.worker.celery_worker worker -l info -Q test-queue -c 1" 60 | 61 | volumes: 62 | rabbitmq_data: 63 | driver: local 64 | redis_data: 65 | driver: local 66 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "amqp" 3 | version = "5.0.9" 4 | description = "Low-level AMQP client for Python (fork of amqplib)." 5 | category = "main" 6 | optional = false 7 | python-versions = ">=3.6" 8 | 9 | [package.dependencies] 10 | vine = "5.0.0" 11 | 12 | [[package]] 13 | name = "anyio" 14 | version = "3.5.0" 15 | description = "High level compatibility layer for multiple asynchronous event loop implementations" 16 | category = "main" 17 | optional = false 18 | python-versions = ">=3.6.2" 19 | 20 | [package.dependencies] 21 | idna = ">=2.8" 22 | sniffio = ">=1.1" 23 | typing-extensions = {version = "*", markers = "python_version < \"3.8\""} 24 | 25 | [package.extras] 26 | doc = ["packaging", "sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"] 27 | test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=6.0)", "pytest-mock (>=3.6.1)", "trustme", "contextlib2", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"] 28 | trio = ["trio (>=0.16)"] 29 | 30 | [[package]] 31 | name = "billiard" 32 | version = "3.6.4.0" 33 | description = "Python multiprocessing fork with improvements and bugfixes" 34 | category = "main" 35 | optional = false 36 | python-versions = "*" 37 | 38 | [[package]] 39 | name = "cached-property" 40 | version = "1.5.2" 41 | description = "A decorator for caching properties in classes." 42 | category = "main" 43 | optional = false 44 | python-versions = "*" 45 | 46 | [[package]] 47 | name = "celery" 48 | version = "5.3.6" 49 | description = "Distributed Task Queue." 50 | category = "main" 51 | optional = false 52 | python-versions = "3.12.1" 53 | 54 | [package.dependencies] 55 | billiard = ">=3.6.4.0,<4.0" 56 | click = ">=8.0.3,<9.0" 57 | click-didyoumean = ">=0.0.3" 58 | click-plugins = ">=1.1.1" 59 | click-repl = ">=0.2.0" 60 | kombu = ">=5.2.3,<6.0" 61 | pytz = ">=2021.3" 62 | vine = ">=5.0.0,<6.0" 63 | 64 | [package.extras] 65 | arangodb = ["pyArango (>=1.3.2)"] 66 | auth = ["cryptography"] 67 | azureblockblob = ["azure-storage-blob (==12.9.0)"] 68 | brotli = ["brotli (>=1.0.0)", "brotlipy (>=0.7.0)"] 69 | cassandra = ["cassandra-driver (<3.21.0)"] 70 | consul = ["python-consul2"] 71 | cosmosdbsql = ["pydocumentdb (==2.3.2)"] 72 | couchbase = ["couchbase (>=3.0.0)"] 73 | couchdb = ["pycouchdb"] 74 | django = ["Django (>=1.11)"] 75 | dynamodb = ["boto3 (>=1.9.178)"] 76 | elasticsearch = ["elasticsearch"] 77 | eventlet = ["eventlet (>=0.32.0)"] 78 | gevent = ["gevent (>=1.5.0)"] 79 | librabbitmq = ["librabbitmq (>=1.5.0)"] 80 | memcache = ["pylibmc"] 81 | mongodb = ["pymongo[srv] (>=3.11.1)"] 82 | msgpack = ["msgpack"] 83 | pymemcache = ["python-memcached"] 84 | pyro = ["pyro4"] 85 | pytest = ["pytest-celery"] 86 | redis = ["redis (>=3.4.1,!=4.0.0,!=4.0.1)"] 87 | s3 = ["boto3 (>=1.9.125)"] 88 | slmq = ["softlayer-messaging (>=1.0.3)"] 89 | solar = ["ephem"] 90 | sqlalchemy = ["sqlalchemy"] 91 | sqs = ["kombu"] 92 | tblib = ["tblib (>=1.3.0)", "tblib (>=1.5.0)"] 93 | yaml = ["PyYAML (>=3.10)"] 94 | zookeeper = ["kazoo (>=1.3.1)"] 95 | zstd = ["zstandard"] 96 | 97 | [[package]] 98 | name = "click" 99 | version = "8.0.3" 100 | description = "Composable command line interface toolkit" 101 | category = "main" 102 | optional = false 103 | python-versions = ">=3.6" 104 | 105 | [package.dependencies] 106 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 107 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 108 | 109 | [[package]] 110 | name = "click-didyoumean" 111 | version = "0.3.0" 112 | description = "Enables git-like *did-you-mean* feature in click" 113 | category = "main" 114 | optional = false 115 | python-versions = ">=3.6.2,<4.0.0" 116 | 117 | [package.dependencies] 118 | click = ">=7" 119 | 120 | [[package]] 121 | name = "click-plugins" 122 | version = "1.1.1" 123 | description = "An extension module for click to enable registering CLI commands via setuptools entry-points." 124 | category = "main" 125 | optional = false 126 | python-versions = "*" 127 | 128 | [package.dependencies] 129 | click = ">=4.0" 130 | 131 | [package.extras] 132 | dev = ["pytest (>=3.6)", "pytest-cov", "wheel", "coveralls"] 133 | 134 | [[package]] 135 | name = "click-repl" 136 | version = "0.2.0" 137 | description = "REPL plugin for Click" 138 | category = "main" 139 | optional = false 140 | python-versions = "*" 141 | 142 | [package.dependencies] 143 | click = "*" 144 | prompt-toolkit = "*" 145 | six = "*" 146 | 147 | [[package]] 148 | name = "colorama" 149 | version = "0.4.4" 150 | description = "Cross-platform colored terminal text." 151 | category = "main" 152 | optional = false 153 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 154 | 155 | [[package]] 156 | name = "deprecated" 157 | version = "1.2.13" 158 | description = "Python @deprecated decorator to deprecate old python classes, functions or methods." 159 | category = "main" 160 | optional = false 161 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 162 | 163 | [package.dependencies] 164 | wrapt = ">=1.10,<2" 165 | 166 | [package.extras] 167 | dev = ["tox", "bump2version (<1)", "sphinx (<2)", "importlib-metadata (<3)", "importlib-resources (<4)", "configparser (<5)", "sphinxcontrib-websupport (<2)", "zipp (<2)", "PyTest (<5)", "PyTest-Cov (<2.6)", "pytest", "pytest-cov"] 168 | 169 | [[package]] 170 | name = "fastapi" 171 | version = "0.70.1" 172 | description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" 173 | category = "main" 174 | optional = false 175 | python-versions = ">=3.6.1" 176 | 177 | [package.dependencies] 178 | pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" 179 | starlette = "0.16.0" 180 | 181 | [package.extras] 182 | all = ["requests (>=2.24.0,<3.0.0)", "jinja2 (>=2.11.2,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "itsdangerous (>=1.1.0,<3.0.0)", "pyyaml (>=5.3.1,<6.0.0)", "ujson (>=4.0.1,<5.0.0)", "orjson (>=3.2.1,<4.0.0)", "email_validator (>=1.1.1,<2.0.0)", "uvicorn[standard] (>=0.12.0,<0.16.0)"] 183 | dev = ["python-jose[cryptography] (>=3.3.0,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "autoflake (>=1.4.0,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "uvicorn[standard] (>=0.12.0,<0.16.0)"] 184 | doc = ["mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=7.1.9,<8.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "typer-cli (>=0.0.12,<0.0.13)", "pyyaml (>=5.3.1,<6.0.0)"] 185 | test = ["pytest (>=6.2.4,<7.0.0)", "pytest-cov (>=2.12.0,<4.0.0)", "mypy (==0.910)", "flake8 (>=3.8.3,<4.0.0)", "black (==21.9b0)", "isort (>=5.0.6,<6.0.0)", "requests (>=2.24.0,<3.0.0)", "httpx (>=0.14.0,<0.19.0)", "email_validator (>=1.1.1,<2.0.0)", "sqlalchemy (>=1.3.18,<1.5.0)", "peewee (>=3.13.3,<4.0.0)", "databases[sqlite] (>=0.3.2,<0.6.0)", "orjson (>=3.2.1,<4.0.0)", "ujson (>=4.0.1,<5.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "flask (>=1.1.2,<3.0.0)", "anyio[trio] (>=3.2.1,<4.0.0)", "types-ujson (==0.1.1)", "types-orjson (==3.6.0)", "types-dataclasses (==0.1.7)"] 186 | 187 | [[package]] 188 | name = "flake8" 189 | version = "3.9.2" 190 | description = "the modular source code checker: pep8 pyflakes and co" 191 | category = "main" 192 | optional = false 193 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 194 | 195 | [package.dependencies] 196 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 197 | mccabe = ">=0.6.0,<0.7.0" 198 | pycodestyle = ">=2.7.0,<2.8.0" 199 | pyflakes = ">=2.3.0,<2.4.0" 200 | 201 | [[package]] 202 | name = "h11" 203 | version = "0.12.0" 204 | description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" 205 | category = "main" 206 | optional = false 207 | python-versions = ">=3.6" 208 | 209 | [[package]] 210 | name = "h2" 211 | version = "4.1.0" 212 | description = "HTTP/2 State-Machine based protocol implementation" 213 | category = "main" 214 | optional = false 215 | python-versions = ">=3.6.1" 216 | 217 | [package.dependencies] 218 | hpack = ">=4.0,<5" 219 | hyperframe = ">=6.0,<7" 220 | 221 | [[package]] 222 | name = "hpack" 223 | version = "4.0.0" 224 | description = "Pure-Python HPACK header compression" 225 | category = "main" 226 | optional = false 227 | python-versions = ">=3.6.1" 228 | 229 | [[package]] 230 | name = "hypercorn" 231 | version = "0.13.2" 232 | description = "A ASGI Server based on Hyper libraries and inspired by Gunicorn" 233 | category = "main" 234 | optional = false 235 | python-versions = ">=3.7" 236 | 237 | [package.dependencies] 238 | h11 = "*" 239 | h2 = ">=3.1.0" 240 | priority = "*" 241 | toml = "*" 242 | typing_extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} 243 | wsproto = ">=0.14.0" 244 | 245 | [package.extras] 246 | h3 = ["aioquic (>=0.9.0,<1.0)"] 247 | trio = ["trio (>=0.11.0)"] 248 | uvloop = ["uvloop"] 249 | 250 | [[package]] 251 | name = "hyperframe" 252 | version = "6.0.1" 253 | description = "HTTP/2 framing layer for Python" 254 | category = "main" 255 | optional = false 256 | python-versions = ">=3.6.1" 257 | 258 | [[package]] 259 | name = "idna" 260 | version = "3.3" 261 | description = "Internationalized Domain Names in Applications (IDNA)" 262 | category = "main" 263 | optional = false 264 | python-versions = ">=3.5" 265 | 266 | [[package]] 267 | name = "importlib-metadata" 268 | version = "4.10.0" 269 | description = "Read metadata from Python packages" 270 | category = "main" 271 | optional = false 272 | python-versions = ">=3.7" 273 | 274 | [package.dependencies] 275 | typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} 276 | zipp = ">=0.5" 277 | 278 | [package.extras] 279 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] 280 | perf = ["ipython"] 281 | testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] 282 | 283 | [[package]] 284 | name = "kombu" 285 | version = "5.2.3" 286 | description = "Messaging library for Python." 287 | category = "main" 288 | optional = false 289 | python-versions = ">=3.7" 290 | 291 | [package.dependencies] 292 | amqp = ">=5.0.9,<6.0.0" 293 | cached-property = {version = "*", markers = "python_version < \"3.8\""} 294 | importlib-metadata = {version = ">=0.18", markers = "python_version < \"3.8\""} 295 | vine = "*" 296 | 297 | [package.extras] 298 | azureservicebus = ["azure-servicebus (>=7.0.0)"] 299 | azurestoragequeues = ["azure-storage-queue"] 300 | consul = ["python-consul (>=0.6.0)"] 301 | librabbitmq = ["librabbitmq (>=2.0.0)"] 302 | mongodb = ["pymongo (>=3.3.0,<3.12.1)"] 303 | msgpack = ["msgpack"] 304 | pyro = ["pyro4"] 305 | qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"] 306 | redis = ["redis (>=3.4.1,!=4.0.0,!=4.0.1)"] 307 | slmq = ["softlayer-messaging (>=1.0.3)"] 308 | sqlalchemy = ["sqlalchemy"] 309 | sqs = ["boto3 (>=1.9.12)", "pycurl (>=7.44.1,<7.45.0)", "urllib3 (>=1.26.7)"] 310 | yaml = ["PyYAML (>=3.10)"] 311 | zookeeper = ["kazoo (>=1.3.1)"] 312 | 313 | [[package]] 314 | name = "mccabe" 315 | version = "0.6.1" 316 | description = "McCabe checker, plugin for flake8" 317 | category = "main" 318 | optional = false 319 | python-versions = "*" 320 | 321 | [[package]] 322 | name = "packaging" 323 | version = "21.3" 324 | description = "Core utilities for Python packages" 325 | category = "main" 326 | optional = false 327 | python-versions = ">=3.6" 328 | 329 | [package.dependencies] 330 | pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" 331 | 332 | [[package]] 333 | name = "priority" 334 | version = "2.0.0" 335 | description = "A pure-Python implementation of the HTTP/2 priority tree" 336 | category = "main" 337 | optional = false 338 | python-versions = ">=3.6.1" 339 | 340 | [[package]] 341 | name = "prompt-toolkit" 342 | version = "3.0.24" 343 | description = "Library for building powerful interactive command lines in Python" 344 | category = "main" 345 | optional = false 346 | python-versions = ">=3.6.2" 347 | 348 | [package.dependencies] 349 | wcwidth = "*" 350 | 351 | [[package]] 352 | name = "pycodestyle" 353 | version = "2.7.0" 354 | description = "Python style guide checker" 355 | category = "main" 356 | optional = false 357 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 358 | 359 | [[package]] 360 | name = "pydantic" 361 | version = "1.9.0" 362 | description = "Data validation and settings management using python 3.6 type hinting" 363 | category = "main" 364 | optional = false 365 | python-versions = ">=3.6.1" 366 | 367 | [package.dependencies] 368 | typing-extensions = ">=3.7.4.3" 369 | 370 | [package.extras] 371 | dotenv = ["python-dotenv (>=0.10.4)"] 372 | email = ["email-validator (>=1.0.3)"] 373 | 374 | [[package]] 375 | name = "pyflakes" 376 | version = "2.3.1" 377 | description = "passive checker of Python programs" 378 | category = "main" 379 | optional = false 380 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 381 | 382 | [[package]] 383 | name = "pyparsing" 384 | version = "3.0.6" 385 | description = "Python parsing module" 386 | category = "main" 387 | optional = false 388 | python-versions = ">=3.6" 389 | 390 | [package.extras] 391 | diagrams = ["jinja2", "railroad-diagrams"] 392 | 393 | [[package]] 394 | name = "pytz" 395 | version = "2021.3" 396 | description = "World timezone definitions, modern and historical" 397 | category = "main" 398 | optional = false 399 | python-versions = "*" 400 | 401 | [[package]] 402 | name = "redis" 403 | version = "4.1.0" 404 | description = "Python client for Redis database and key-value store" 405 | category = "main" 406 | optional = false 407 | python-versions = ">=3.6" 408 | 409 | [package.dependencies] 410 | deprecated = ">=1.2.3" 411 | importlib-metadata = {version = ">=1.0", markers = "python_version < \"3.8\""} 412 | packaging = ">=21.3" 413 | 414 | [package.extras] 415 | cryptography = ["cryptography (>=36.0.1)", "requests (>=2.26.0)"] 416 | hiredis = ["hiredis (>=1.0.0)"] 417 | 418 | [[package]] 419 | name = "six" 420 | version = "1.16.0" 421 | description = "Python 2 and 3 compatibility utilities" 422 | category = "main" 423 | optional = false 424 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 425 | 426 | [[package]] 427 | name = "sniffio" 428 | version = "1.2.0" 429 | description = "Sniff out which async library your code is running under" 430 | category = "main" 431 | optional = false 432 | python-versions = ">=3.5" 433 | 434 | [[package]] 435 | name = "starlette" 436 | version = "0.16.0" 437 | description = "The little ASGI library that shines." 438 | category = "main" 439 | optional = false 440 | python-versions = ">=3.6" 441 | 442 | [package.dependencies] 443 | anyio = ">=3.0.0,<4" 444 | typing-extensions = {version = "*", markers = "python_version < \"3.8\""} 445 | 446 | [package.extras] 447 | full = ["itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests", "graphene"] 448 | 449 | [[package]] 450 | name = "toml" 451 | version = "0.10.2" 452 | description = "Python Library for Tom's Obvious, Minimal Language" 453 | category = "main" 454 | optional = false 455 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 456 | 457 | [[package]] 458 | name = "typing-extensions" 459 | version = "4.0.1" 460 | description = "Backported and Experimental Type Hints for Python 3.6+" 461 | category = "main" 462 | optional = false 463 | python-versions = ">=3.6" 464 | 465 | [[package]] 466 | name = "vine" 467 | version = "5.0.0" 468 | description = "Promises, promises, promises." 469 | category = "main" 470 | optional = false 471 | python-versions = ">=3.6" 472 | 473 | [[package]] 474 | name = "wcwidth" 475 | version = "0.2.5" 476 | description = "Measures the displayed width of unicode strings in a terminal" 477 | category = "main" 478 | optional = false 479 | python-versions = "*" 480 | 481 | [[package]] 482 | name = "wrapt" 483 | version = "1.13.3" 484 | description = "Module for decorators, wrappers and monkey patching." 485 | category = "main" 486 | optional = false 487 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 488 | 489 | [[package]] 490 | name = "wsproto" 491 | version = "1.0.0" 492 | description = "WebSockets state-machine based protocol implementation" 493 | category = "main" 494 | optional = false 495 | python-versions = ">=3.6.1" 496 | 497 | [package.dependencies] 498 | h11 = ">=0.9.0,<1" 499 | 500 | [[package]] 501 | name = "zipp" 502 | version = "3.7.0" 503 | description = "Backport of pathlib-compatible object wrapper for zip files" 504 | category = "main" 505 | optional = false 506 | python-versions = ">=3.7" 507 | 508 | [package.extras] 509 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] 510 | testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] 511 | 512 | [metadata] 513 | lock-version = "1.1" 514 | python-versions = "^3.7" 515 | content-hash = "88a5f528bde6da847867903dbac19bc5f0dfe3ecd105eb009e730b23315ca557" 516 | 517 | [metadata.files] 518 | amqp = [ 519 | {file = "amqp-5.0.9-py3-none-any.whl", hash = "sha256:9cd81f7b023fc04bbb108718fbac674f06901b77bfcdce85b10e2a5d0ee91be5"}, 520 | {file = "amqp-5.0.9.tar.gz", hash = "sha256:1e5f707424e544078ca196e72ae6a14887ce74e02bd126be54b7c03c971bef18"}, 521 | ] 522 | anyio = [ 523 | {file = "anyio-3.5.0-py3-none-any.whl", hash = "sha256:b5fa16c5ff93fa1046f2eeb5bbff2dad4d3514d6cda61d02816dba34fa8c3c2e"}, 524 | {file = "anyio-3.5.0.tar.gz", hash = "sha256:a0aeffe2fb1fdf374a8e4b471444f0f3ac4fb9f5a5b542b48824475e0042a5a6"}, 525 | ] 526 | billiard = [ 527 | {file = "billiard-3.6.4.0-py3-none-any.whl", hash = "sha256:87103ea78fa6ab4d5c751c4909bcff74617d985de7fa8b672cf8618afd5a875b"}, 528 | {file = "billiard-3.6.4.0.tar.gz", hash = "sha256:299de5a8da28a783d51b197d496bef4f1595dd023a93a4f59dde1886ae905547"}, 529 | ] 530 | cached-property = [ 531 | {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, 532 | {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, 533 | ] 534 | celery = [ 535 | {file = "celery-5.2.3-py3-none-any.whl", hash = "sha256:8aacd02fc23a02760686d63dde1eb0daa9f594e735e73ea8fb15c2ff15cb608c"}, 536 | {file = "celery-5.2.3.tar.gz", hash = "sha256:e2cd41667ad97d4f6a2f4672d1c6a6ebada194c619253058b5f23704aaadaa82"}, 537 | ] 538 | click = [ 539 | {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, 540 | {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, 541 | ] 542 | click-didyoumean = [ 543 | {file = "click-didyoumean-0.3.0.tar.gz", hash = "sha256:f184f0d851d96b6d29297354ed981b7dd71df7ff500d82fa6d11f0856bee8035"}, 544 | {file = "click_didyoumean-0.3.0-py3-none-any.whl", hash = "sha256:a0713dc7a1de3f06bc0df5a9567ad19ead2d3d5689b434768a6145bff77c0667"}, 545 | ] 546 | click-plugins = [ 547 | {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"}, 548 | {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"}, 549 | ] 550 | click-repl = [ 551 | {file = "click-repl-0.2.0.tar.gz", hash = "sha256:cd12f68d745bf6151210790540b4cb064c7b13e571bc64b6957d98d120dacfd8"}, 552 | {file = "click_repl-0.2.0-py3-none-any.whl", hash = "sha256:94b3fbbc9406a236f176e0506524b2937e4b23b6f4c0c0b2a0a83f8a64e9194b"}, 553 | ] 554 | colorama = [ 555 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, 556 | {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, 557 | ] 558 | deprecated = [ 559 | {file = "Deprecated-1.2.13-py2.py3-none-any.whl", hash = "sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d"}, 560 | {file = "Deprecated-1.2.13.tar.gz", hash = "sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d"}, 561 | ] 562 | fastapi = [ 563 | {file = "fastapi-0.70.1-py3-none-any.whl", hash = "sha256:5367226c7bcd7bfb2e17edaf225fd9a983095b1372281e9a3eb661336fb93748"}, 564 | {file = "fastapi-0.70.1.tar.gz", hash = "sha256:21d03979b5336375c66fa5d1f3126c6beca650d5d2166fbb78345a30d33c8d06"}, 565 | ] 566 | flake8 = [ 567 | {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, 568 | {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, 569 | ] 570 | h11 = [ 571 | {file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"}, 572 | {file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"}, 573 | ] 574 | h2 = [ 575 | {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, 576 | {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, 577 | ] 578 | hpack = [ 579 | {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, 580 | {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, 581 | ] 582 | hypercorn = [ 583 | {file = "Hypercorn-0.13.2-py3-none-any.whl", hash = "sha256:ca18f91ab3fa823cbe9e949738f9f2cc07027cd647c80d8f93e4b1a2a175f112"}, 584 | {file = "Hypercorn-0.13.2.tar.gz", hash = "sha256:6307be5cbdf6ba411967d4661202dc4f79bd511b5d318bc4eed88b09418427f8"}, 585 | ] 586 | hyperframe = [ 587 | {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, 588 | {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, 589 | ] 590 | idna = [ 591 | {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, 592 | {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, 593 | ] 594 | importlib-metadata = [ 595 | {file = "importlib_metadata-4.10.0-py3-none-any.whl", hash = "sha256:b7cf7d3fef75f1e4c80a96ca660efbd51473d7e8f39b5ab9210febc7809012a4"}, 596 | {file = "importlib_metadata-4.10.0.tar.gz", hash = "sha256:92a8b58ce734b2a4494878e0ecf7d79ccd7a128b5fc6014c401e0b61f006f0f6"}, 597 | ] 598 | kombu = [ 599 | {file = "kombu-5.2.3-py3-none-any.whl", hash = "sha256:eeaeb8024f3a5cfc71c9250e45cddb8493f269d74ada2f74909a93c59c4b4179"}, 600 | {file = "kombu-5.2.3.tar.gz", hash = "sha256:81a90c1de97e08d3db37dbf163eaaf667445e1068c98bfd89f051a40e9f6dbbd"}, 601 | ] 602 | mccabe = [ 603 | {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, 604 | {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, 605 | ] 606 | packaging = [ 607 | {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, 608 | {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, 609 | ] 610 | priority = [ 611 | {file = "priority-2.0.0-py3-none-any.whl", hash = "sha256:6f8eefce5f3ad59baf2c080a664037bb4725cd0a790d53d59ab4059288faf6aa"}, 612 | {file = "priority-2.0.0.tar.gz", hash = "sha256:c965d54f1b8d0d0b19479db3924c7c36cf672dbf2aec92d43fbdaf4492ba18c0"}, 613 | ] 614 | prompt-toolkit = [ 615 | {file = "prompt_toolkit-3.0.24-py3-none-any.whl", hash = "sha256:e56f2ff799bacecd3e88165b1e2f5ebf9bcd59e80e06d395fa0cc4b8bd7bb506"}, 616 | {file = "prompt_toolkit-3.0.24.tar.gz", hash = "sha256:1bb05628c7d87b645974a1bad3f17612be0c29fa39af9f7688030163f680bad6"}, 617 | ] 618 | pycodestyle = [ 619 | {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, 620 | {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, 621 | ] 622 | pydantic = [ 623 | {file = "pydantic-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb23bcc093697cdea2708baae4f9ba0e972960a835af22560f6ae4e7e47d33f5"}, 624 | {file = "pydantic-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1d5278bd9f0eee04a44c712982343103bba63507480bfd2fc2790fa70cd64cf4"}, 625 | {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab624700dc145aa809e6f3ec93fb8e7d0f99d9023b713f6a953637429b437d37"}, 626 | {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8d7da6f1c1049eefb718d43d99ad73100c958a5367d30b9321b092771e96c25"}, 627 | {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3c3b035103bd4e2e4a28da9da7ef2fa47b00ee4a9cf4f1a735214c1bcd05e0f6"}, 628 | {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3011b975c973819883842c5ab925a4e4298dffccf7782c55ec3580ed17dc464c"}, 629 | {file = "pydantic-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:086254884d10d3ba16da0588604ffdc5aab3f7f09557b998373e885c690dd398"}, 630 | {file = "pydantic-1.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0fe476769acaa7fcddd17cadd172b156b53546ec3614a4d880e5d29ea5fbce65"}, 631 | {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8e9dcf1ac499679aceedac7e7ca6d8641f0193c591a2d090282aaf8e9445a46"}, 632 | {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1e4c28f30e767fd07f2ddc6f74f41f034d1dd6bc526cd59e63a82fe8bb9ef4c"}, 633 | {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c86229333cabaaa8c51cf971496f10318c4734cf7b641f08af0a6fbf17ca3054"}, 634 | {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:c0727bda6e38144d464daec31dff936a82917f431d9c39c39c60a26567eae3ed"}, 635 | {file = "pydantic-1.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:dee5ef83a76ac31ab0c78c10bd7d5437bfdb6358c95b91f1ba7ff7b76f9996a1"}, 636 | {file = "pydantic-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9c9bdb3af48e242838f9f6e6127de9be7063aad17b32215ccc36a09c5cf1070"}, 637 | {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ee7e3209db1e468341ef41fe263eb655f67f5c5a76c924044314e139a1103a2"}, 638 | {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b6037175234850ffd094ca77bf60fb54b08b5b22bc85865331dd3bda7a02fa1"}, 639 | {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b2571db88c636d862b35090ccf92bf24004393f85c8870a37f42d9f23d13e032"}, 640 | {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8b5ac0f1c83d31b324e57a273da59197c83d1bb18171e512908fe5dc7278a1d6"}, 641 | {file = "pydantic-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bbbc94d0c94dd80b3340fc4f04fd4d701f4b038ebad72c39693c794fd3bc2d9d"}, 642 | {file = "pydantic-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e0896200b6a40197405af18828da49f067c2fa1f821491bc8f5bde241ef3f7d7"}, 643 | {file = "pydantic-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bdfdadb5994b44bd5579cfa7c9b0e1b0e540c952d56f627eb227851cda9db77"}, 644 | {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:574936363cd4b9eed8acdd6b80d0143162f2eb654d96cb3a8ee91d3e64bf4cf9"}, 645 | {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c556695b699f648c58373b542534308922c46a1cda06ea47bc9ca45ef5b39ae6"}, 646 | {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f947352c3434e8b937e3aa8f96f47bdfe6d92779e44bb3f41e4c213ba6a32145"}, 647 | {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5e48ef4a8b8c066c4a31409d91d7ca372a774d0212da2787c0d32f8045b1e034"}, 648 | {file = "pydantic-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:96f240bce182ca7fe045c76bcebfa0b0534a1bf402ed05914a6f1dadff91877f"}, 649 | {file = "pydantic-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:815ddebb2792efd4bba5488bc8fde09c29e8ca3227d27cf1c6990fc830fd292b"}, 650 | {file = "pydantic-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c5b77947b9e85a54848343928b597b4f74fc364b70926b3c4441ff52620640c"}, 651 | {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c68c3bc88dbda2a6805e9a142ce84782d3930f8fdd9655430d8576315ad97ce"}, 652 | {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a79330f8571faf71bf93667d3ee054609816f10a259a109a0738dac983b23c3"}, 653 | {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5a64b64ddf4c99fe201ac2724daada8595ada0d102ab96d019c1555c2d6441d"}, 654 | {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a733965f1a2b4090a5238d40d983dcd78f3ecea221c7af1497b845a9709c1721"}, 655 | {file = "pydantic-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cc6a4cb8a118ffec2ca5fcb47afbacb4f16d0ab8b7350ddea5e8ef7bcc53a16"}, 656 | {file = "pydantic-1.9.0-py3-none-any.whl", hash = "sha256:085ca1de245782e9b46cefcf99deecc67d418737a1fd3f6a4f511344b613a5b3"}, 657 | {file = "pydantic-1.9.0.tar.gz", hash = "sha256:742645059757a56ecd886faf4ed2441b9c0cd406079c2b4bee51bcc3fbcd510a"}, 658 | ] 659 | pyflakes = [ 660 | {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, 661 | {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, 662 | ] 663 | pyparsing = [ 664 | {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, 665 | {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, 666 | ] 667 | pytz = [ 668 | {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, 669 | {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, 670 | ] 671 | redis = [ 672 | {file = "redis-4.1.0-py3-none-any.whl", hash = "sha256:e13fad67c098a33141bacde872786960e86a5c97a4255009bcd43c795fa1cc77"}, 673 | {file = "redis-4.1.0.tar.gz", hash = "sha256:21f0a23bce707909076e6ba2ce076cba59bff60d2ab22972e0647fdf620ffe47"}, 674 | ] 675 | six = [ 676 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 677 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 678 | ] 679 | sniffio = [ 680 | {file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"}, 681 | {file = "sniffio-1.2.0.tar.gz", hash = "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de"}, 682 | ] 683 | starlette = [ 684 | {file = "starlette-0.16.0-py3-none-any.whl", hash = "sha256:38eb24bf705a2c317e15868e384c1b8a12ca396e5a3c3a003db7e667c43f939f"}, 685 | {file = "starlette-0.16.0.tar.gz", hash = "sha256:e1904b5d0007aee24bdd3c43994be9b3b729f4f58e740200de1d623f8c3a8870"}, 686 | ] 687 | toml = [ 688 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, 689 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, 690 | ] 691 | typing-extensions = [ 692 | {file = "typing_extensions-4.0.1-py3-none-any.whl", hash = "sha256:7f001e5ac290a0c0401508864c7ec868be4e701886d5b573a9528ed3973d9d3b"}, 693 | {file = "typing_extensions-4.0.1.tar.gz", hash = "sha256:4ca091dea149f945ec56afb48dae714f21e8692ef22a395223bcd328961b6a0e"}, 694 | ] 695 | vine = [ 696 | {file = "vine-5.0.0-py2.py3-none-any.whl", hash = "sha256:4c9dceab6f76ed92105027c49c823800dd33cacce13bdedc5b914e3514b7fb30"}, 697 | {file = "vine-5.0.0.tar.gz", hash = "sha256:7d3b1624a953da82ef63462013bbd271d3eb75751489f9807598e8f340bd637e"}, 698 | ] 699 | wcwidth = [ 700 | {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, 701 | {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, 702 | ] 703 | wrapt = [ 704 | {file = "wrapt-1.13.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:e05e60ff3b2b0342153be4d1b597bbcfd8330890056b9619f4ad6b8d5c96a81a"}, 705 | {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:85148f4225287b6a0665eef08a178c15097366d46b210574a658c1ff5b377489"}, 706 | {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2dded5496e8f1592ec27079b28b6ad2a1ef0b9296d270f77b8e4a3a796cf6909"}, 707 | {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:e94b7d9deaa4cc7bac9198a58a7240aaf87fe56c6277ee25fa5b3aa1edebd229"}, 708 | {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:498e6217523111d07cd67e87a791f5e9ee769f9241fcf8a379696e25806965af"}, 709 | {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ec7e20258ecc5174029a0f391e1b948bf2906cd64c198a9b8b281b811cbc04de"}, 710 | {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:87883690cae293541e08ba2da22cacaae0a092e0ed56bbba8d018cc486fbafbb"}, 711 | {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:f99c0489258086308aad4ae57da9e8ecf9e1f3f30fa35d5e170b4d4896554d80"}, 712 | {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6a03d9917aee887690aa3f1747ce634e610f6db6f6b332b35c2dd89412912bca"}, 713 | {file = "wrapt-1.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:936503cb0a6ed28dbfa87e8fcd0a56458822144e9d11a49ccee6d9a8adb2ac44"}, 714 | {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f9c51d9af9abb899bd34ace878fbec8bf357b3194a10c4e8e0a25512826ef056"}, 715 | {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:220a869982ea9023e163ba915077816ca439489de6d2c09089b219f4e11b6785"}, 716 | {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0877fe981fd76b183711d767500e6b3111378ed2043c145e21816ee589d91096"}, 717 | {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:43e69ffe47e3609a6aec0fe723001c60c65305784d964f5007d5b4fb1bc6bf33"}, 718 | {file = "wrapt-1.13.3-cp310-cp310-win32.whl", hash = "sha256:78dea98c81915bbf510eb6a3c9c24915e4660302937b9ae05a0947164248020f"}, 719 | {file = "wrapt-1.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:ea3e746e29d4000cd98d572f3ee2a6050a4f784bb536f4ac1f035987fc1ed83e"}, 720 | {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:8c73c1a2ec7c98d7eaded149f6d225a692caa1bd7b2401a14125446e9e90410d"}, 721 | {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:086218a72ec7d986a3eddb7707c8c4526d677c7b35e355875a0fe2918b059179"}, 722 | {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:e92d0d4fa68ea0c02d39f1e2f9cb5bc4b4a71e8c442207433d8db47ee79d7aa3"}, 723 | {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:d4a5f6146cfa5c7ba0134249665acd322a70d1ea61732723c7d3e8cc0fa80755"}, 724 | {file = "wrapt-1.13.3-cp35-cp35m-win32.whl", hash = "sha256:8aab36778fa9bba1a8f06a4919556f9f8c7b33102bd71b3ab307bb3fecb21851"}, 725 | {file = "wrapt-1.13.3-cp35-cp35m-win_amd64.whl", hash = "sha256:944b180f61f5e36c0634d3202ba8509b986b5fbaf57db3e94df11abee244ba13"}, 726 | {file = "wrapt-1.13.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2ebdde19cd3c8cdf8df3fc165bc7827334bc4e353465048b36f7deeae8ee0918"}, 727 | {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:610f5f83dd1e0ad40254c306f4764fcdc846641f120c3cf424ff57a19d5f7ade"}, 728 | {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5601f44a0f38fed36cc07db004f0eedeaadbdcec90e4e90509480e7e6060a5bc"}, 729 | {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:e6906d6f48437dfd80464f7d7af1740eadc572b9f7a4301e7dd3d65db285cacf"}, 730 | {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:766b32c762e07e26f50d8a3468e3b4228b3736c805018e4b0ec8cc01ecd88125"}, 731 | {file = "wrapt-1.13.3-cp36-cp36m-win32.whl", hash = "sha256:5f223101f21cfd41deec8ce3889dc59f88a59b409db028c469c9b20cfeefbe36"}, 732 | {file = "wrapt-1.13.3-cp36-cp36m-win_amd64.whl", hash = "sha256:f122ccd12fdc69628786d0c947bdd9cb2733be8f800d88b5a37c57f1f1d73c10"}, 733 | {file = "wrapt-1.13.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:46f7f3af321a573fc0c3586612db4decb7eb37172af1bc6173d81f5b66c2e068"}, 734 | {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:778fd096ee96890c10ce96187c76b3e99b2da44e08c9e24d5652f356873f6709"}, 735 | {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0cb23d36ed03bf46b894cfec777eec754146d68429c30431c99ef28482b5c1df"}, 736 | {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:96b81ae75591a795d8c90edc0bfaab44d3d41ffc1aae4d994c5aa21d9b8e19a2"}, 737 | {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7dd215e4e8514004c8d810a73e342c536547038fb130205ec4bba9f5de35d45b"}, 738 | {file = "wrapt-1.13.3-cp37-cp37m-win32.whl", hash = "sha256:47f0a183743e7f71f29e4e21574ad3fa95676136f45b91afcf83f6a050914829"}, 739 | {file = "wrapt-1.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fd76c47f20984b43d93de9a82011bb6e5f8325df6c9ed4d8310029a55fa361ea"}, 740 | {file = "wrapt-1.13.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b73d4b78807bd299b38e4598b8e7bd34ed55d480160d2e7fdaabd9931afa65f9"}, 741 | {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ec9465dd69d5657b5d2fa6133b3e1e989ae27d29471a672416fd729b429eb554"}, 742 | {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dd91006848eb55af2159375134d724032a2d1d13bcc6f81cd8d3ed9f2b8e846c"}, 743 | {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ae9de71eb60940e58207f8e71fe113c639da42adb02fb2bcbcaccc1ccecd092b"}, 744 | {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:51799ca950cfee9396a87f4a1240622ac38973b6df5ef7a41e7f0b98797099ce"}, 745 | {file = "wrapt-1.13.3-cp38-cp38-win32.whl", hash = "sha256:4b9c458732450ec42578b5642ac53e312092acf8c0bfce140ada5ca1ac556f79"}, 746 | {file = "wrapt-1.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:7dde79d007cd6dfa65afe404766057c2409316135cb892be4b1c768e3f3a11cb"}, 747 | {file = "wrapt-1.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:981da26722bebb9247a0601e2922cedf8bb7a600e89c852d063313102de6f2cb"}, 748 | {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:705e2af1f7be4707e49ced9153f8d72131090e52be9278b5dbb1498c749a1e32"}, 749 | {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25b1b1d5df495d82be1c9d2fad408f7ce5ca8a38085e2da41bb63c914baadff7"}, 750 | {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:77416e6b17926d953b5c666a3cb718d5945df63ecf922af0ee576206d7033b5e"}, 751 | {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:865c0b50003616f05858b22174c40ffc27a38e67359fa1495605f96125f76640"}, 752 | {file = "wrapt-1.13.3-cp39-cp39-win32.whl", hash = "sha256:0a017a667d1f7411816e4bf214646d0ad5b1da2c1ea13dec6c162736ff25a374"}, 753 | {file = "wrapt-1.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:81bd7c90d28a4b2e1df135bfbd7c23aee3050078ca6441bead44c42483f9ebfb"}, 754 | {file = "wrapt-1.13.3.tar.gz", hash = "sha256:1fea9cd438686e6682271d36f3481a9f3636195578bab9ca3382e2f5f01fc185"}, 755 | ] 756 | wsproto = [ 757 | {file = "wsproto-1.0.0-py3-none-any.whl", hash = "sha256:d8345d1808dd599b5ffb352c25a367adb6157e664e140dbecba3f9bc007edb9f"}, 758 | {file = "wsproto-1.0.0.tar.gz", hash = "sha256:868776f8456997ad0d9720f7322b746bbe9193751b5b290b7f924659377c8c38"}, 759 | ] 760 | zipp = [ 761 | {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, 762 | {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, 763 | ] 764 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "fastapi-celery" 3 | version = "0.1.0" 4 | description = "FastAPI with Celery tasks minimal example" 5 | authors = ["Grega Vrbančič "] 6 | 7 | [tool.poetry.dependencies] 8 | python = "3.12.1" 9 | flake8 = "^3.8.3" 10 | fastapi = "^0.70.0" 11 | hypercorn = "^0.13.2" 12 | celery = "^5.3.6" 13 | redis = "^4.1.0" 14 | 15 | [tool.poetry.dev-dependencies] 16 | flake8 = "^3.8.3" 17 | 18 | [build-system] 19 | requires = ["poetry>=0.12"] 20 | build-backend = "poetry.masonry.api" 21 | --------------------------------------------------------------------------------