Mengapa Anda mencoba FastAPI?

gambar Logo diambil dari repositori Github FastAPI


FastAPI adalah kerangka kerja web yang relatif baru yang ditulis dalam bahasa pemrograman Python untuk membuat REST (dan, jika Anda berusaha keras, maka GraphQL) API berdasarkan pada fitur Python 3.6+ baru, seperti: petunjuk jenis, asinkron asli (asyncio ) Antara lain, FastAPI terintegrasi erat dengan skema OpenAPI dan secara otomatis menghasilkan dokumentasi untuk API Anda melalui Swagger dan ReDoc


FastAPI didasarkan pada Starlette dan Pydantic .
Starlette adalah kerangka kerja mikro ASGI untuk menulis aplikasi web.
Pydantic - perpustakaan untuk mem -parsing dan memvalidasi data berdasarkan tipe-petunjuk Python.


Apa yang mereka katakan tentang FastAPI?


"[...] Saya menggunakan FastAPI sangat sering dalam beberapa hari terakhir. [...] Saya pasti berencana menggunakannya untuk semua layanan ML dari tim saya di Microsoft. Beberapa dari mereka berintegrasi ke Windows dan beberapa produk Office."

Kabir Khan - Microsoft ( ref )


"Jika Anda ingin mempelajari kerangka kerja lain untuk menulis API REST, lihat FastAPI [...] Ini cepat, mudah digunakan dan dipelajari. [...]"

"Sekarang kami menggunakan FastAPI untuk API kami [...] Saya pikir Anda akan menyukainya! [...]"

Ines Montani - Matthew Honnibal - Pendiri AI Explosion - pencipta spaCy ( ref ) - ( ref )


API Minimal dibuat menggunakan FastAPI


Saya akan mencoba menunjukkan kepada Anda cara membuat API yang sederhana, tetapi pada saat yang sama bermanfaat dengan dokumentasi untuk pengembang. Kami akan menulis generator frasa acak!


Menginstal prasyarat


pip install wheel -U pip install uvicorn fastapi pydantic 

Modul baru!
Uvicorn adalah server web yang kompatibel dengan ASGI yang akan kami gunakan untuk menjalankan aplikasi kami.


Pertama, kami akan membuat dasar aplikasi kami.


 from fastapi import FastAPI app = FastAPI(title="Random phrase") 

Aplikasi ini sudah berjalan dan bisa dimulai.
Tuliskan perintah ini di terminal Anda dan buka halaman di browser di http://127.0.0.1:8000/docs .


 uvicorn <__>:app 

Tetapi sementara di aplikasi kita tidak ada titik akhir tunggal ditunjukkan - mari kita perbaiki!


Basis data


Karena kita sedang menulis generator frasa acak, kita jelas perlu menyimpannya di suatu tempat. Untuk ini, saya memilih python-dict sederhana.


Buat file db.py dan mulai menulis kode.


Kami mengimpor modul yang diperlukan:


 import typing import random from pydantic import BaseModel from pydantic import Field 

Setelah - kami menetapkan dua model: frasa input (yang akan dikirimkan oleh pengguna kepada kami) dan "output" (yang akan kami kirim ke pengguna).


 class PhraseInput(BaseModel): """Phrase model""" author: str = "Anonymous" #  .    -   . text: str = Field(..., title="Text", description="Text of phrase", max_length=200) #  .   - 200 . class PhraseOutput(PhraseInput): id: typing.Optional[int] = None # ID     . 

Setelah itu, buat kelas sederhana untuk bekerja dengan database:


 class Database: """ Our **fake** database. """ def __init__(self): self._items: typing.Dict[int, PhraseOutput] = {} # id: model def get_random(self) -> int: #    return random.choice(self._items.keys()) def get(self, id: int) -> typing.Optional[PhraseOutput]: #    ID return self._items.get(id) def add(self, phrase: PhraseInput) -> PhraseOutput: #   id = len(self._items) + 1 phrase_out = PhraseOutput(id=id, **phrase.dict()) self._items[phrase_out.id] = phrase_out return phrase_out def delete(self, id: int) -> typing.Union[typing.NoReturn, None]: #   if id in self._items: del self._items[id] else: raise ValueError("Phrase doesn't exist") 

Sekarang Anda dapat mulai menulis API itu sendiri.


API


Buat file main.py dan impor modul-modul berikut:


 from fastapi import FastAPI from fastapi import HTTPException from db import PhraseInput from db import PhraseOutput from db import Database 

Kami menginisialisasi aplikasi dan basis data kami:


 app = FastAPI(title="Random phrase") db = Database() 

Dan tulis metode sederhana untuk mendapatkan frasa acak!


 @app.get( "/get", response_description="Random phrase", description="Get random phrase from database", response_model=PhraseOutput, ) async def get(): try: phrase = db.get(db.get_random()) except IndexError: raise HTTPException(404, "Phrase list is empty") return phrase 

Seperti yang Anda lihat, di dekorator saya juga menunjukkan beberapa nilai lain yang diperlukan untuk menghasilkan dokumentasi yang lebih indah :) Dalam dokumentasi resmi Anda dapat melihat semua parameter yang mungkin.


Dalam potongan kode ini, kami mencoba untuk mendapatkan frasa acak dari database, dan jika database kosong, kami mengembalikan kesalahan dengan kode 404.


Demikian pula, kami menulis metode lain:


 @app.post( "/add", response_description="Added phrase with *id* parameter", response_model=PhraseOutput, ) async def add(phrase: PhraseInput): phrase_out = db.add(phrase) return phrase_out @app.delete("/delete", response_description="Result of deleting") async def delete(id: int): try: db.delete(id) except ValueError as e: raise HTTPException(404, str(e)) 

Dan itu dia! API kami yang kecil namun bermanfaat selesai!


Sekarang kita dapat meluncurkan aplikasi menggunakan uvicorn , buka dokumentasi online ( http://127.0.0.1/docs ) dan coba API kami!



Bahan yang berguna


Tentu saja, saya tidak dapat memberi tahu Anda tentang semua fitur FastAPI, misalnya, seperti: sistem DI pintar, middlewares, cookie, metode otentikasi standar di API (jwt, oauth2, kunci-api) dan banyak lagi!


Tetapi tujuan dari artikel ini bukanlah tinjauan umum dari semua fitur kerangka kerja ini, tetapi seberapa besar dorongan Anda untuk menjelajahinya sendiri. FastAPI memiliki dokumentasi yang bagus dengan banyak contoh.


Kode dari sebuah artikel di Github
Dokumentasi resmi
Repositori Github


PS


cryo8822 membuat terjemahan artikel ke dalam bahasa Inggris, terima kasih! .

Source: https://habr.com/ru/post/id478620/


All Articles