fastapi-custom
FastAPI is a modern, fast (high-performance) web framework for building APIs with Python 3.7+ based on standard Python type hints. It is built on top of Starlette for web handling and Pydantic for data validation.
Science Score: 44.0%
This score indicates how likely this project is to be science-related based on various indicators:
-
✓CITATION.cff file
Found CITATION.cff file -
✓codemeta.json file
Found codemeta.json file -
✓.zenodo.json file
Found .zenodo.json file -
○DOI references
-
○Academic publication links
-
○Academic email domains
-
○Institutional organization owner
-
○JOSS paper metadata
-
○Scientific vocabulary similarity
Low similarity (16.4%) to scientific vocabulary
Repository
FastAPI is a modern, fast (high-performance) web framework for building APIs with Python 3.7+ based on standard Python type hints. It is built on top of Starlette for web handling and Pydantic for data validation.
Basic Info
- Host: GitHub
- Owner: aderinsolabamidele
- License: mit
- Language: Python
- Default Branch: main
- Size: 13.3 MB
Statistics
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 5
- Releases: 0
Metadata Files
README.md
FastAPI framework, high performance, easy to learn, fast to code, ready for production
FastAPI is a modern, fast (high-performance), web framework for building APIs with Python based on standard Python type hints.
The key features are:
- Fast: Very high performance, on par with NodeJS and Go (thanks to Starlette and Pydantic). One of the fastest Python frameworks available.
- Fast to code: Increase the speed to develop features by about 200% to 300%. *
- Fewer bugs: Reduce about 40% of human (developer) induced errors. *
- Intuitive: Great editor support. Completion everywhere. Less time debugging.
- Easy: Designed to be easy to use and learn. Less time reading docs.
- Short: Minimize code duplication. Multiple features from each parameter declaration. Fewer bugs.
- Robust: Get production-ready code. With automatic interactive documentation.
- Standards-based: Based on (and fully compatible with) the open standards for APIs: OpenAPI (previously known as Swagger) and JSON Schema.
* estimation based on tests on an internal development team, building production applications.
Typer, the FastAPI of CLIs
If you are building a CLI app to be used in the terminal instead of a web API, check out Typer.
Typer is FastAPI's little sibling. And it's intended to be the FastAPI of CLIs. ⌨️ 🚀
Requirements
FastAPI stands on the shoulders of giants:
Installation
Create and activate a virtual environment and then install FastAPI:
Note: Make sure you put "fastapi[standard]" in quotes to ensure it works in all terminals.
Example
Create it
Create a file main.py with:
```Python from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/") def read_root(): return {"Hello": "World"}
@app.get("/items/{itemid}") def readitem(itemid: int, q: Union[str, None] = None): return {"itemid": item_id, "q": q} ```
Or use async def...
If your code uses `async` / `await`, use `async def`:
```Python hl_lines="9 14"
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
**Note**:
If you don't know, check the _"In a hurry?"_ section about `async` and `await` in the docs.
Run it
Run the server with:
About the command fastapi dev main.py...
The command `fastapi dev` reads your `main.py` file, detects the **FastAPI** app in it, and starts a server using Uvicorn.
By default, `fastapi dev` will start with auto-reload enabled for local development.
You can read more about it in the FastAPI CLI docs.
Check it
Open your browser at http://127.0.0.1:8000/items/5?q=somequery.
You will see the JSON response as:
JSON
{"item_id": 5, "q": "somequery"}
You already created an API that:
- Receives HTTP requests in the paths
/and/items/{item_id}. - Both paths take
GEToperations (also known as HTTP methods). - The path
/items/{item_id}has a path parameteritem_idthat should be anint. - The path
/items/{item_id}has an optionalstrquery parameterq.
Interactive API docs
Now go to http://127.0.0.1:8000/docs.
You will see the automatic interactive API documentation (provided by Swagger UI):

Alternative API docs
And now, go to http://127.0.0.1:8000/redoc.
You will see the alternative automatic documentation (provided by ReDoc):

Example upgrade
Now modify the file main.py to receive a body from a PUT request.
Declare the body using standard Python types, thanks to Pydantic.
```Python hl_lines="4 9-12 25-27" from typing import Union
from fastapi import FastAPI from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel): name: str price: float is_offer: Union[bool, None] = None
@app.get("/") def read_root(): return {"Hello": "World"}
@app.get("/items/{itemid}") def readitem(itemid: int, q: Union[str, None] = None): return {"itemid": item_id, "q": q}
@app.put("/items/{itemid}") def updateitem(itemid: int, item: Item): return {"itemname": item.name, "itemid": itemid} ```
The fastapi dev server should reload automatically.
Interactive API docs upgrade
Now go to http://127.0.0.1:8000/docs.
- The interactive API documentation will be automatically updated, including the new body:

- Click on the button "Try it out", it allows you to fill the parameters and directly interact with the API:

- Then click on the "Execute" button, the user interface will communicate with your API, send the parameters, get the results and show them on the screen:

Alternative API docs upgrade
And now, go to http://127.0.0.1:8000/redoc.
- The alternative documentation will also reflect the new query parameter and body:

Recap
In summary, you declare once the types of parameters, body, etc. as function parameters.
You do that with standard modern Python types.
You don't have to learn a new syntax, the methods or classes of a specific library, etc.
Just standard Python.
For example, for an int:
Python
item_id: int
or for a more complex Item model:
Python
item: Item
...and with that single declaration you get:
- Editor support, including:
- Completion.
- Type checks.
- Validation of data:
- Automatic and clear errors when the data is invalid.
- Validation even for deeply nested JSON objects.
- Conversion of input data: coming from the network to Python data and types. Reading from:
- JSON.
- Path parameters.
- Query parameters.
- Cookies.
- Headers.
- Forms.
- Files.
- Conversion of output data: converting from Python data and types to network data (as JSON):
- Convert Python types (
str,int,float,bool,list, etc). datetimeobjects.UUIDobjects.- Database models.
- ...and many more.
- Convert Python types (
- Automatic interactive API documentation, including 2 alternative user interfaces:
- Swagger UI.
- ReDoc.
Coming back to the previous code example, FastAPI will:
- Validate that there is an
item_idin the path forGETandPUTrequests. - Validate that the
item_idis of typeintforGETandPUTrequests.- If it is not, the client will see a useful, clear error.
- Check if there is an optional query parameter named
q(as inhttp://127.0.0.1:8000/items/foo?q=somequery) forGETrequests.- As the
qparameter is declared with= None, it is optional. - Without the
Noneit would be required (as is the body in the case withPUT).
- As the
- For
PUTrequests to/items/{item_id}, read the body as JSON:- Check that it has a required attribute
namethat should be astr. - Check that it has a required attribute
pricethat has to be afloat. - Check that it has an optional attribute
is_offer, that should be abool, if present. - All this would also work for deeply nested JSON objects.
- Check that it has a required attribute
- Convert from and to JSON automatically.
- Document everything with OpenAPI, that can be used by:
- Interactive documentation systems.
- Automatic client code generation systems, for many languages.
- Provide 2 interactive documentation web interfaces directly.
We just scratched the surface, but you already get the idea of how it all works.
Try changing the line with:
Python
return {"item_name": item.name, "item_id": item_id}
...from:
Python
... "item_name": item.name ...
...to:
Python
... "item_price": item.price ...
...and see how your editor will auto-complete the attributes and know their types:

For a more complete example including more features, see the Tutorial - User Guide.
Spoiler alert: the tutorial - user guide includes:
- Declaration of parameters from other different places as: headers, cookies, form fields and files.
- How to set validation constraints as
maximum_lengthorregex. - A very powerful and easy to use Dependency Injection system.
- Security and authentication, including support for OAuth2 with JWT tokens and HTTP Basic auth.
- More advanced (but equally easy) techniques for declaring deeply nested JSON models (thanks to Pydantic).
- GraphQL integration with Strawberry and other libraries.
- Many extra features (thanks to Starlette) as:
- WebSockets
- extremely easy tests based on HTTPX and
pytest - CORS
- Cookie Sessions
- ...and more.
Performance
Independent TechEmpower benchmarks show FastAPI applications running under Uvicorn as one of the fastest Python frameworks available, only below Starlette and Uvicorn themselves (used internally by FastAPI). (*)
To understand more about it, see the section Benchmarks.
Dependencies
FastAPI depends on Pydantic and Starlette.
standard Dependencies
When you install FastAPI with pip install "fastapi[standard]" it comes with the standard group of optional dependencies:
Used by Pydantic:
email-validator- for email validation.
Used by Starlette:
httpx- Required if you want to use theTestClient.jinja2- Required if you want to use the default template configuration.python-multipart- Required if you want to support form "parsing", withrequest.form().
Used by FastAPI:
uvicorn- for the server that loads and serves your application. This includesuvicorn[standard], which includes some dependencies (e.g.uvloop) needed for high performance serving.fastapi-cli[standard]- to provide thefastapicommand.- This includes
fastapi-cloud-cli, which allows you to deploy your FastAPI application to FastAPI Cloud.
- This includes
Without standard Dependencies
If you don't want to include the standard optional dependencies, you can install with pip install fastapi instead of pip install "fastapi[standard]".
Without fastapi-cloud-cli
If you want to install FastAPI with the standard dependencies but without the fastapi-cloud-cli, you can install with pip install "fastapi[standard-no-fastapi-cloud-cli]".
Additional Optional Dependencies
There are some additional dependencies you might want to install.
Additional optional Pydantic dependencies:
pydantic-settings- for settings management.pydantic-extra-types- for extra types to be used with Pydantic.
Additional optional FastAPI dependencies:
orjson- Required if you want to useORJSONResponse.ujson- Required if you want to useUJSONResponse.
License
This project is licensed under the terms of the MIT license.
Owner
- Login: aderinsolabamidele
- Kind: user
- Repositories: 1
- Profile: https://github.com/aderinsolabamidele
Citation (CITATION.cff)
# This CITATION.cff file was generated with cffinit.
# Visit https://bit.ly/cffinit to generate yours today!
cff-version: 1.2.0
title: FastAPI
message: >-
If you use this software, please cite it using the
metadata from this file.
type: software
authors:
- given-names: Sebastián
family-names: Ramírez
email: tiangolo@gmail.com
identifiers:
repository-code: 'https://github.com/fastapi/fastapi'
url: 'https://fastapi.tiangolo.com'
abstract: >-
FastAPI framework, high performance, easy to learn, fast to code,
ready for production
keywords:
- fastapi
- pydantic
- starlette
license: MIT
GitHub Events
Total
- Delete event: 4
- Issue comment event: 4
- Push event: 4
- Pull request event: 12
- Create event: 11
Last Year
- Delete event: 4
- Issue comment event: 4
- Push event: 4
- Pull request event: 12
- Create event: 11
Issues and Pull Requests
Last synced: 6 months ago
All Time
- Total issues: 0
- Total pull requests: 8
- Average time to close issues: N/A
- Average time to close pull requests: about 1 month
- Total issue authors: 0
- Total pull request authors: 1
- Average comments per issue: 0
- Average comments per pull request: 0.25
- Merged pull requests: 0
- Bot issues: 0
- Bot pull requests: 8
Past Year
- Issues: 0
- Pull requests: 8
- Average time to close issues: N/A
- Average time to close pull requests: about 1 month
- Issue authors: 0
- Pull request authors: 1
- Average comments per issue: 0
- Average comments per pull request: 0.25
- Merged pull requests: 0
- Bot issues: 0
- Bot pull requests: 8
Top Authors
Issue Authors
Pull Request Authors
- dependabot[bot] (8)
Top Labels
Issue Labels
Pull Request Labels
Dependencies
- actions/add-to-project v1.0.2 composite
- actions/cache v4 composite
- actions/checkout v4 composite
- actions/setup-python v5 composite
- actions/upload-artifact v4 composite
- astral-sh/setup-uv v6 composite
- dorny/paths-filter v3 composite
- re-actors/alls-green release/v1 composite
- actions/checkout v4 composite
- actions/setup-python v5 composite
- astral-sh/setup-uv v6 composite
- mxschmitt/action-tmate v3 composite
- actions/checkout v4 composite
- actions/download-artifact v4 composite
- actions/setup-python v5 composite
- astral-sh/setup-uv v6 composite
- cloudflare/wrangler-action v3 composite
- tiangolo/issue-manager 0.5.1 composite
- actions/checkout v4 composite
- actions/setup-python v5 composite
- astral-sh/setup-uv v6 composite
- actions/labeler v5 composite
- docker://agilepathway/pull-request-label-checker latest composite
- actions/checkout v4 composite
- mxschmitt/action-tmate v3 composite
- tiangolo/latest-changes 0.3.2 composite
- actions/checkout v4 composite
- actions/setup-python v5 composite
- astral-sh/setup-uv v6 composite
- mxschmitt/action-tmate v3 composite
- actions/checkout v4 composite
- actions/setup-python v5 composite
- astral-sh/setup-uv v6 composite
- mxschmitt/action-tmate v3 composite
- actions/checkout v4 composite
- actions/setup-python v5 composite
- pypa/gh-action-pypi-publish v1.12.4 composite
- actions/checkout v4 composite
- actions/download-artifact v4 composite
- actions/setup-python v5 composite
- astral-sh/setup-uv v6 composite
- actions/checkout v4 composite
- actions/setup-python v5 composite
- astral-sh/setup-uv v6 composite
- mxschmitt/action-tmate v3 composite
- actions/checkout v4 composite
- actions/setup-python v5 composite
- re-actors/alls-green release/v1 composite
- actions/checkout v4 composite
- actions/download-artifact v4 composite
- actions/setup-python v5 composite
- actions/upload-artifact v4 composite
- astral-sh/setup-uv v6 composite
- re-actors/alls-green release/v1 composite
- actions/checkout v4 composite
- actions/setup-python v5 composite
- astral-sh/setup-uv v6 composite
- pydantic >=1.7.4,!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0
- starlette >=0.40.0,<0.48.0
- typing-extensions >=4.8.0
- httpx >=0.23.0,<0.29.0 test
- ruff ==0.11.2 test
- black ==25.1.0
- cairosvg ==2.7.1
- griffe-typingdoc ==0.2.8
- jieba ==0.42.1
- markdown-include-variants ==0.0.4
- mdx-include >=1.4.1,<2.0.0
- mkdocs-macros-plugin ==1.3.7
- mkdocs-material ==9.6.15
- mkdocs-redirects >=1.2.1,<1.3.0
- mkdocstrings ==0.26.1
- pillow ==11.3.0
- pyyaml >=5.3.1,<7.0.0
- typer ==0.16.0
- PyGithub >=2.3.0,<3.0.0
- httpx >=0.27.0,<0.29.0
- pydantic >=2.5.3,<3.0.0
- pydantic-settings >=2.1.0,<3.0.0
- pyyaml >=5.3.1,<7.0.0
- smokeshow *
- PyJWT ==2.8.0 test
- anyio >=3.2.1,<5.0.0 test
- coverage >=6.5.0,<8.0 test
- dirty-equals ==0.9.0 test
- flask >=1.1.2,<4.0.0 test
- inline-snapshot >=0.21.1 test
- mypy ==1.8.0 test
- passlib >=1.7.2,<2.0.0 test
- pytest >=7.1.3,<9.0.0 test
- pyyaml >=5.3.1,<7.0.0 test
- sqlmodel ==0.0.24 test
- types-orjson ==3.6.2 test
- types-ujson ==5.10.0.20240515 test
- pydantic-ai ==0.0.30
- playwright *
- pre-commit >=2.17.0,<5.0.0
