{"id":26671072,"url":"https://github.com/mr-fatalyst/fastopenapi","last_synced_at":"2025-05-15T13:07:30.639Z","repository":{"id":280197522,"uuid":"937666512","full_name":"mr-fatalyst/fastopenapi","owner":"mr-fatalyst","description":"FastOpenAPI is a library for generating and integrating OpenAPI schemas using Pydantic v2 and various frameworks (AioHttp, Falcon, Flask, Quart, Sanic, Starlette, Tornado).","archived":false,"fork":false,"pushed_at":"2025-04-24T20:43:59.000Z","size":1579,"stargazers_count":401,"open_issues_count":0,"forks_count":8,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-24T21:42:52.126Z","etag":null,"topics":["aiohttp","falcon","fastopenapi","flask","json-schema","openapi","openapi-generator","pydantic","pydantic-v2","quart","redoc","sanic","starlette","swagger","swagger-ui","tornado","validation","web"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mr-fatalyst.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-02-23T16:12:09.000Z","updated_at":"2025-04-24T20:54:09.000Z","dependencies_parsed_at":null,"dependency_job_id":"27d3f0b1-31a9-4c0c-bd48-78b0c44c9454","html_url":"https://github.com/mr-fatalyst/fastopenapi","commit_stats":null,"previous_names":["mr-fatalyst/fastopenapi"],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mr-fatalyst%2Ffastopenapi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mr-fatalyst%2Ffastopenapi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mr-fatalyst%2Ffastopenapi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mr-fatalyst%2Ffastopenapi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mr-fatalyst","download_url":"https://codeload.github.com/mr-fatalyst/fastopenapi/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254346624,"owners_count":22055808,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aiohttp","falcon","fastopenapi","flask","json-schema","openapi","openapi-generator","pydantic","pydantic-v2","quart","redoc","sanic","starlette","swagger","swagger-ui","tornado","validation","web"],"created_at":"2025-03-25T23:32:23.835Z","updated_at":"2025-05-15T13:07:25.629Z","avatar_url":"https://github.com/mr-fatalyst.png","language":"Python","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/mr-fatalyst/fastopenapi/master/logo.png\" alt=\"Logo\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cb\u003eFastOpenAPI\u003c/b\u003e is a library for generating and integrating OpenAPI schemas using Pydantic and various frameworks.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  This project was inspired by \u003ca href=\"https://fastapi.tiangolo.com/\"\u003eFastAPI\u003c/a\u003e and aims to provide a similar developer-friendly experience.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/license/mr-fatalyst/fastopenapi\"\u003e\n  \u003cimg src=\"https://github.com/mr-fatalyst/fastopenapi/actions/workflows/master.yml/badge.svg\"\u003e\n  \u003cimg src=\"https://codecov.io/gh/mr-fatalyst/fastopenapi/branch/master/graph/badge.svg?token=USHR1I0CJB\"\u003e\n  \u003cimg src=\"https://img.shields.io/pypi/v/fastopenapi\"\u003e\n  \u003cimg src=\"https://img.shields.io/pypi/pyversions/fastopenapi\"\u003e\n  \u003cimg src=\"https://static.pepy.tech/badge/fastopenapi\" alt=\"PyPI Downloads\"\u003e\n\u003c/p\u003e\n\n---\n\n\n## 📦 Installation\n#### Install only FastOpenAPI:\n```bash\npip install fastopenapi\n```\n\n#### Install FastOpenAPI with a specific framework:\n```bash\npip install fastopenapi[aiohttp]\n```\n```bash\npip install fastopenapi[falcon]\n```\n```bash\npip install fastopenapi[flask]\n```\n```bash\npip install fastopenapi[quart]\n```\n```bash\npip install fastopenapi[sanic]\n```\n```bash\npip install fastopenapi[starlette]\n```\n```bash\npip install fastopenapi[tornado]\n```\n\n---\n\n## 🛠️ Quick Start\n\n### Step 1. Create an application\n\n- Create the `main.py` file\n- Copy the code from an example\n- For some examples uvicorn is required (`pip install uvicorn`)\n\n#### Examples:\n\n- ![AIOHTTP](https://img.shields.io/badge/AioHttp-0078D7?style=flat\u0026logo=python\u0026logoColor=white)\n  \u003cdetails\u003e\n    \u003csummary\u003eClick to expand the Falcon Example\u003c/summary\u003e\n    \n    ```python\n    from aiohttp import web\n    from pydantic import BaseModel\n    \n    from fastopenapi.routers import AioHttpRouter\n    \n    app = web.Application()\n    router = AioHttpRouter(app=app)\n    \n    \n    class HelloResponse(BaseModel):\n        message: str\n    \n    \n    @router.get(\"/hello\", tags=[\"Hello\"], status_code=200, response_model=HelloResponse)\n    async def hello(name: str):\n        \"\"\"Say hello from aiohttp\"\"\"\n        return HelloResponse(message=f\"Hello, {name}! It's aiohttp!\")\n    \n    \n    if __name__ == \"__main__\":\n        web.run_app(app, host=\"127.0.0.1\", port=8000)\n    ```\n  \u003c/details\u003e\n\n- ![Falcon](https://img.shields.io/badge/Falcon-45b8d8?style=flat\u0026logo=falcon\u0026logoColor=white)\n  \u003cdetails\u003e\n    \u003csummary\u003eClick to expand the Falcon Example\u003c/summary\u003e\n    \n    ```python\n    import falcon.asgi\n    import uvicorn\n    from pydantic import BaseModel\n    \n    from fastopenapi.routers import FalconRouter\n    \n    app = falcon.asgi.App()\n    router = FalconRouter(app=app)\n    \n    \n    class HelloResponse(BaseModel):\n        message: str\n    \n    \n    @router.get(\"/hello\", tags=[\"Hello\"], status_code=200, response_model=HelloResponse)\n    async def hello(name: str):\n        \"\"\"Say hello from Falcon\"\"\"\n        return HelloResponse(message=f\"Hello, {name}! It's Falcon!\")\n    \n    \n    if __name__ == \"__main__\":\n        uvicorn.run(app, host=\"127.0.0.1\", port=8000)\n    ```\n  \u003c/details\u003e\n\n- ![Flask](https://img.shields.io/badge/-Flask-EEEEEE?style=flat\u0026logo=flask\u0026logoColor=black)\n  \u003cdetails\u003e\n    \u003csummary\u003eClick to expand the Flask Example\u003c/summary\u003e\n    \n    ```python\n    from flask import Flask\n    from pydantic import BaseModel\n    \n    from fastopenapi.routers import FlaskRouter\n    \n    app = Flask(__name__)\n    router = FlaskRouter(app=app)\n    \n    \n    class HelloResponse(BaseModel):\n        message: str\n    \n    \n    @router.get(\"/hello\", tags=[\"Hello\"], status_code=200, response_model=HelloResponse)\n    def hello(name: str):\n        \"\"\"Say hello from Flask\"\"\"\n        return HelloResponse(message=f\"Hello, {name}! It's Flask!\")\n    \n    \n    if __name__ == \"__main__\":\n        app.run(port=8000)\n    ```\n  \u003c/details\u003e\n\n- ![Quart](https://img.shields.io/badge/-Quart-4997D0?style=flat\u0026logo=python\u0026logoColor=white)\n  \u003cdetails\u003e\n    \u003csummary\u003eClick to expand the Quart Example\u003c/summary\u003e\n    \n    ```python\n    from pydantic import BaseModel\n    from quart import Quart\n    \n    from fastopenapi.routers import QuartRouter\n    \n    app = Quart(__name__)\n    router = QuartRouter(app=app)\n    \n    \n    class HelloResponse(BaseModel):\n        message: str\n    \n    \n    @router.get(\"/hello\", tags=[\"Hello\"], status_code=200, response_model=HelloResponse)\n    async def hello(name: str):\n        \"\"\"Say hello from Quart\"\"\"\n        return HelloResponse(message=f\"Hello, {name}! It's Quart!\")\n    \n    \n    if __name__ == \"__main__\":\n        app.run(port=8000)\n    ```\n  \u003c/details\u003e\n\n- ![Sanic](https://img.shields.io/badge/-Sanic-00bfff?style=flat\u0026logo=sanic\u0026logoColor=white)\n  \u003cdetails\u003e\n    \u003csummary\u003eClick to expand the Sanic Example\u003c/summary\u003e\n    \n    ```python\n    from pydantic import BaseModel\n    from sanic import Sanic\n    \n    from fastopenapi.routers import SanicRouter\n    \n    app = Sanic(\"MySanicApp\")\n    router = SanicRouter(app=app)\n    \n    \n    class HelloResponse(BaseModel):\n        message: str\n    \n    \n    @router.get(\"/hello\", tags=[\"Hello\"], status_code=200, response_model=HelloResponse)\n    async def hello(name: str):\n        \"\"\"Say hello from Sanic\"\"\"\n        return HelloResponse(message=f\"Hello, {name}! It's Sanic!\")\n    \n    \n    if __name__ == \"__main__\":\n        app.run(host=\"0.0.0.0\", port=8000)\n    ```\n  \u003c/details\u003e\n\n- ![Starlette](https://img.shields.io/badge/-Starlette-4B0082?style=flat\u0026logo=python\u0026logoColor=white)\n  \u003cdetails\u003e\n    \u003csummary\u003eClick to expand the Starlette Example\u003c/summary\u003e\n    \n    ```python\n    import uvicorn\n    from pydantic import BaseModel\n    from starlette.applications import Starlette\n    \n    from fastopenapi.routers import StarletteRouter\n    \n    app = Starlette()\n    router = StarletteRouter(app=app)\n    \n    \n    class HelloResponse(BaseModel):\n        message: str\n    \n    \n    @router.get(\"/hello\", tags=[\"Hello\"], status_code=200, response_model=HelloResponse)\n    async def hello(name: str):\n        \"\"\"Say hello from Starlette\"\"\"\n        return HelloResponse(message=f\"Hello, {name}! It's Starlette!\")\n    \n    if __name__ == \"__main__\":\n        uvicorn.run(app, host=\"127.0.0.1\", port=8000)\n    ```\n  \u003c/details\u003e\n\n- ![Tornado](https://img.shields.io/badge/-Tornado-2980B9?style=flat\u0026logo=python\u0026logoColor=white)\n  \u003cdetails\u003e\n    \u003csummary\u003eClick to expand the Tornado Example\u003c/summary\u003e\n    \n    ```python\n    import asyncio\n  \n    from pydantic import BaseModel\n    from tornado.web import Application\n  \n    from fastopenapi.routers.tornado import TornadoRouter\n  \n    app = Application()\n  \n    router = TornadoRouter(app=app)\n  \n  \n    class HelloResponse(BaseModel):\n        message: str\n  \n  \n    @router.get(\"/hello\", tags=[\"Hello\"], status_code=200, response_model=HelloResponse)\n    def hello(name: str):\n        \"\"\"Say hello from Tornado\"\"\"\n        return HelloResponse(message=f\"Hello, {name}! It's Tornado!\")\n  \n  \n    async def main():\n        app.listen(8000)\n        await asyncio.Event().wait()\n  \n  \n    if __name__ == \"__main__\":\n        asyncio.run(main())\n    ```\n  \u003c/details\u003e\n\n### Step 2. Run the server\n\nLaunch the application:\n\n```bash\npython main.py\n```\n\nOnce launched, the documentation will be available at:\n\nSwagger UI:\n```\nhttp://127.0.0.1:8000/docs\n```\nReDoc UI:\n```\nhttp://127.0.0.1:8000/redoc\n```\n\n---\n\n## ⚙️ Features\n- **Generate OpenAPI schemas** with Pydantic v2.\n- **Data validation** using Pydantic models.\n- **Supports multiple frameworks:** AIOHTTP, Falcon, Flask, Quart, Sanic, Starlette, Tornado.\n- **Proxy routing provides FastAPI-style routing**\n\n---\n\n## 📖 Documentation\n\nExplore the [Docs](https://github.com/mr-fatalyst/fastopenapi/blob/master/docs/en/index.md) for an overview of FastOpenAPI, its core components, and usage guidelines. The documentation is continuously updated and improved.\n\n---\n\n## 📂 Advanced Examples\n\nExamples of integration and detailed usage for each framework are available in the [`examples`](https://github.com/mr-fatalyst/fastopenapi/tree/master/examples) directory.\n\n---\n\n## 📊 Quick \u0026 Dirty Benchmarks\n\nFast but not perfect benchmarks. Check the [`benchmarks`](https://github.com/mr-fatalyst/fastopenapi/tree/master/benchmarks) directory for details.\n\n---\n\n## ✅ Development Recommendations\n\n- Use Pydantic models for strict typing and data validation.\n- Follow the project structure similar to provided examples for easy scalability.\n- Regularly update dependencies and monitor library updates for new features.\n\n---\n\n## 🛠️ Contributing\n\nIf you have suggestions or find a bug, please open an issue or create a pull request on GitHub.\n\n---\n\n## 📄 **License**\nThis project is licensed under the terms of the MIT license.\n","funding_links":[],"categories":["Python"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmr-fatalyst%2Ffastopenapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmr-fatalyst%2Ffastopenapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmr-fatalyst%2Ffastopenapi/lists"}