Developer.

FastApi: podstawy (I)

W poszukiwaniu idealnego frameworka webowego.

Najpopularniejsze frameworki webowe dla Python to Django i Flask. PIerwszy zalecany jest dla dużych serwisów i jak mówią w internecie posiada wszystko co trzeba żeby postawić dużą aplikację. Flask z kolei jest bardzo skromny na dzień dobry, ale poprzez doinstalowanie dodatkowych modułów pozwala na równie wiele.

Django nie testowałem, miałem krótką przygodę z Flask, ale po poznaniu Laravel (PHP) uznałem że potrzebuje czegoś więcej. I wtedy pojawił się FastAPI. Wydaje się on być kompromisem pomiędzy Django a Flask. Ma już sporo rzeczy w sobie, ale jednocześnie pozwala stworzyć serwis w 5 linijkach kodu.

Lokalna instalacja

apt-get install python3-venv
sudo su root

python3 -m venv --copies ve
source ve/bin/activate

pip install -U pip setuptools
pip install wheel
pip list
pip install fastapi[all]

Plik main.py :

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}

Uruchomienie:

uvicorn main:app --port 5000 --reload

W przypadku struktury:

└── project
    └── app
        ├── __init__.py
        └── main.py

uruchomienie odbędzie się komendą:

uvicorn app.main:app --port 5000 --reload

Połączenie z MySQL

pip install sqlalchemy
pip install mysql-connector-python
pip instal sqlacodegen

Do nauki korzystam z MySQL (docker). Uruchomienie:

sudo docker-compose up -d 

Na potrzeby wygenerowania modeli dla SQLAlchemy skorzystałem z sqlacodegen:

sqlacodegen --outfile models.py \
mysql+mysqlconnector://{user_name}:{password}@{host}:{port}/{database_name}?charset=utf8

Struktura dla większego projektu

.
├── app/
│   ├── __init__.py
│   ├── main.py
│   ├── config/
│   │   ├── __init__.py
│   │   ├── db.py
│   │   └── settings.py
│   ├── models/
│   │   ├── __init__.py
│   │   ├── clients.py
│   │   └── user.py
│   ├── routers/
│   │   ├── __init__.py
│   │   ├── auth.py
│   │   ├── basic_db_req.py
│   │   ├── registrations.py
│   │   └── www.py
│   ├── schemas/
│   │   ├── __init__.py
│   │   ├── auth.py
│   │   ├── clients.py
│   │   └── users.py
│   ├── services/
│   │   ├── __init__.py
│   │   ├── auth.py
│   │   ├── clients.py
│   │   ├── crud.py
│   │   └── notification.py
│   ├── static/
│   └── templates/
│       ├── 404.html
│       ├── 500.html
│       ├── form.html
│       ├── index.html
│       ├── navbar.html
│       ├── onboarding.html
│       ├── plt/
│       │   ├── plt_mileage.html
│       │   ├── plt_price.html
│       │   └── plt_sca_year.html
│       ├── price.html
│       └── sudoku.html
└── docker-compose.yml