diff --git a/docs/id/docs/index.md b/docs/id/docs/index.md new file mode 100644 index 000000000..a0afbc52a --- /dev/null +++ b/docs/id/docs/index.md @@ -0,0 +1,480 @@ +--- +hide: + - navigation +--- + + + +

+ FastAPI +

+

+ FastAPI framework, performa tinggi, mudah di pelajari, cepat dalam penulisan kode, siap untuk produksi +

+

+ + Test + + + Coverage + + + Package version + + + Supported Python versions + +

+ +--- + +**Dokumentasi**: https://fastapi.tiangolo.com + +**Sumber Kode**: https://github.com/tiangolo/fastapi + +--- + +FastAPI adalah framework web modern, cepat (kinerja tinggi), untuk membangun API dengan Python 3.8+ berdasarkan standar Python tipe. + +Fitur Utama: + +* **Cepat**: performa sangat tinggi, setara dengan **NodeJS** dan **Go** (terimakasih untuk Starlette dan Pydantic). [Salah satu framework Python tercepat yang tersedia.](#performa). +* **Cepat dalam penulisan kode**: Meningkatkan kecepatan pengembangan fitur sekitar 200% hingga 300%. * +* **Sedikit Bug**: Mengurangi sekitar 40% dari kesalahan yang disebabkan oleh manusia (pengembang). * +* **Intuitif**: Dukungan editor yang sangat baik. Completion dimanapun. Waktu debugging yang lebih sedikit. +* **Mudah**: Dirancang agar mudah digunakan dan dipelajari. Waktu membaca dokumen lebih sedikit. +* **Singkat**: Meminimalkan duplikasi kode. Beberapa fitur dari setiap deklarasi parameter. Lebih sedikit bug. +* **Tangguh**: Dapatkan kode siap produksi. Dengan dokumentasi interaktif otomatis. +* **Berdasarkan standar**: Berdasarkan (dan sepenuhnya kompatibel dengan) standar untuk API OpenAPI (Sebelumnya dikenal sebagai Swagger) dan JSON Schema. + +* estimasi berdasarkan pengujian pada tim pengembangan internal, membangun aplikasi produksi. + +## Sponsor + + + +{% if sponsors %} +{% for sponsor in sponsors.gold -%} + +{% endfor -%} +{%- for sponsor in sponsors.silver -%} + +{% endfor %} +{% endif %} + + + +Sponsor lainnya + +## Pendapat + +"_[...] I'm using **FastAPI** a ton these days. [...] I'm actually planning to use it for all of my team's **ML services at Microsoft**. Some of them are getting integrated into the core **Windows** product and some **Office** products._" + +
Kabir Khan - Microsoft (ref)
+ +--- + +"_We adopted the **FastAPI** library to spawn a **REST** server that can be queried to obtain **predictions**. [for Ludwig]_" + +
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
+ +--- + +"_**Netflix** is pleased to announce the open-source release of our **crisis management** orchestration framework: **Dispatch**! [built with **FastAPI**]_" + +
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
+ +--- + +"_I’m over the moon excited about **FastAPI**. It’s so fun!_" + +
Brian Okken - Python Bytes podcast host (ref)
+ +--- + +"_Honestly, what you've built looks super solid and polished. In many ways, it's what I wanted **Hug** to be - it's really inspiring to see someone build that._" + +
Timothy Crosley - Hug creator (ref)
+ +--- + +"_If you're looking to learn one **modern framework** for building REST APIs, check out **FastAPI** [...] It's fast, easy to use and easy to learn [...]_" + +"_We've switched over to **FastAPI** for our **APIs** [...] I think you'll like it [...]_" + +
Ines Montani - Matthew Honnibal - Explosion AI founders - spaCy creators (ref) - (ref)
+ +--- + +"_If anyone is looking to build a production Python API, I would highly recommend **FastAPI**. It is **beautifully designed**, **simple to use** and **highly scalable**, it has become a **key component** in our API first development strategy and is driving many automations and services such as our Virtual TAC Engineer._" + +
Deon Pillsbury - Cisco (ref)
+ +--- + +## **Typer**, FastAPI untuk antarmuka baris perintah (CLI) + + + +Jika kamu membangun sebuah CLI aplikasi yang digunakan di terminal sebagai pengganti web API, Lihatlah **Typer**. + +**Typer** adalah saudara kecil FastAPI. Dan ini dimaksudkan menjadi **FastAPI untuk CLI**. ⌨️ 🚀 + +## Persyaratan + +Python 3.8+ + +FastAPI berdiri di atas bahu para raksasa: + +* Starlette untuk bagian web. +* Pydantic untuk bagian data. + +## Instalasi + +
+ +```console +$ pip install fastapi + +---> 100% +``` + +
+ +Kamu juga akan memerlukan server ASGI, untuk produksi seperti Uvicorn atau Hypercorn. + +
+ +```console +$ pip install "uvicorn[standard]" + +---> 100% +``` + +
+ +## Contoh + +### Buatlah + +* Buat file `main.py` dengan: + +```Python +from typing import Union + +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: Union[str, None] = None): + return {"item_id": item_id, "q": q} +``` + +
+atau gunakan async def... + +Jika kodemu menggunakan `async` / `await`, gunakan `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**: + +Jika kamu tidak tahu, periksa bagian _"In a hurry?"_ tentang `async` dan `await` di dokumentasi/a>. + +
+ +### Jalankan + +Jalankan server dengan: + +
+ +```console +$ uvicorn main:app --reload + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +INFO: Started reloader process [28720] +INFO: Started server process [28722] +INFO: Waiting for application startup. +INFO: Application startup complete. +``` + +
+ +
+Tentang perintah uvicorn main:app --reload... + +Perintah `uvicorn main:app` merujuk kepada: + +* `main`: file `main.py` (Python "module"). +* `app`: objek yang dibuat di dalam `main.py` dengan baris `app = FastAPI()`. +* `--reload`: membuat server restart setelah perubahan kode. Lakukan ini hanya untuk pengembangan. + +
+ +### Periksa + +Buka browser-mu di
http://127.0.0.1:8000/items/5?q=somequery. + +Kamu akan melihat respons JSON sebagai: + +```JSON +{"item_id": 5, "q": "somequery"} +``` + +Kamu sudah membuat sebuah API yang: + +* Menerima _requests_ HTTP pada _paths_ `/` dan `/items/{item_id}`. +* Kedua _paths_ menggunakan operasi `GET` (juga dikenal sebagai _metode_ HTTP). +* _path_ `/items/{item_id}` memiliki _path parameter_ `item_id` yang seharusnya berupa `int`. +* _path_ `/items/{item_id}` memiliki parameter _query opsional_ `q` bertipe `str`. + +### Dokumentasi API interaktif + +Sekarang buka http://127.0.0.1:8000/docs. + +Kamu akan melihat dokumentasi API interaktif otomatis (disediakan oleh Swagger UI): + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) + +### Dokumentasi API alternatif + +Dan sekarang, buka http://127.0.0.1:8000/redoc. + +Kamu akan melihat dokumentasi otomatis alternatif (disediakan oleh ReDoc): + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) + +## Contoh pembaruan + +Sekarang modifikasi file `main.py` untuk menerima body dari _requests_ `PUT`. + +Deklarasikan body menggunakan tipe Python standar, berkat 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/{item_id}") +def read_item(item_id: int, q: Union[str, None] = None): + return {"item_id": item_id, "q": q} + + +@app.put("/items/{item_id}") +def update_item(item_id: int, item: Item): + return {"item_name": item.name, "item_id": item_id} +``` + +Server seharusnya akan me-reload secara otomatis (karena Kamu menambahkan `--reload` pada perintah `uvicorn` di atas). + +### Pembaruan Dokumentasi API interaktif + +Sekarang buka http://127.0.0.1:8000/docs. + +* Dokumentasi API interaktif akan diperbarui secara otomatis, termasuk body baru: + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) + +* Klik tombol "Try it out", itu memungkinkan kamu mengisi parameter dan berinteraksi langsung dengan API: + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) + +* Kemudian klik tombol "Execute", antarmuka pengguna akan berinteraksi dengan API mu, mengirimkan parameter, mendapatkan hasil, dan menampilkannya di layar: + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) + +### Pembaruan Dokumentasi API alternatif + +Dan sekarang, buka http://127.0.0.1:8000/redoc. + +* Dokumentasi alternatif juga akan mencerminkan parameter pencarian dan body yang baru: + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) + +### Rekap + +Secara ringkas, Kamu mendeklarasikan **sekali** tipe parameter, body, dll. sebagai parameter fungsi. + +Kamu melakukannya dengan tipe standar Python modern. + +Kamu tidak perlu mempelajari sintaks baru, metode atau kelas dari suatu perpustakaan tertentu, dll. + +Hanya standar **Python 3.8+**. + +Untuk Contoh, untuk tipe data `int`: + +```Python +item_id: int +``` + +atau untuk model `Item` yang lebih kompleks: + +```Python +item: Item +``` + +...dan dengan satu deklarasi tersebut kamu mendapatkan: + +* Dukungan editor, termasuk: + * Completion. + * Pengecekan tipe. +* Validasi data: + * Otomatis dan jelas ketika data tidak valid. + * Validasi bahkan untuk objek JSON yang bersarang secara mendalam. +* Konversi data input: datang dari jaringan ke Python data dan tipe. Membaca dari: + * JSON. + * Path parameters. + * Query parameters. + * Cookies. + * Headers. + * Forms. + * Files. +* Konversi data output: mengonversi dari data dan tipe Python ke data jaringan (sebagai JSON): + * Konversi Python tipe (`str`, `int`, `float`, `bool`, `list`, dll). + * `datetime` objek. + * `UUID` objek. + * Database model. + * ...dan banyak lagi. +* Dokumentasi API interaktif otomatis, termasuk 2 antarmuka pengguna alternatif: + * Swagger UI. + * ReDoc. + +--- + +Kembali ke contoh kode sebelumnya, **FastAPI** akan: + +* Validasi bahwa ada `item_id` dalam jalur untuk _requests_ `GET` dan `PUT`. +* Validasi bahwa `item_id` ber-tipe `int` untuk `GET` dan `PUT` _requests_. + * Jika bukan, klien akan melihat _error_ yang berguna dan jelas. +* Periksa apakah ada parameter query opsional bernama `q` (seperti pada `http://127.0.0.1:8000/items/foo?q=somequery`) untuk `GET` _requests_. + * Karena parameter `q` dideklarasikan dengan `= None`, itu bersifat opsional. + * Tanpa `None`, itu akan menjadi wajib (seperti yang terjadi pada _body_ dalam kasus `PUT`). +* Untuk `PUT` _requests_ ke `/items/{item_id}`, Membaca _body_ sebagai JSON: + * Periksa bahwa memiliki atribut yang wajib `name` yang seharusnya berupa `str`. + * Periksa bahwa memiliki atribut yang wajib `price` yang harus berupa `float`. + * Periksa bahwa memiliki atribut opsional `is_offer`, yang seharusnya berupa `bool`, jika ada. + * Semua ini juga akan berfungsi untuk objek JSON yang bersarang secara mendalam. +* Konversi dari dan ke JSON otomatis. +* Dokumentasikan semuanya dengan OpenAPI, yang dapat digunakan oleh: + * Sistem dokumentasi interaktif. + * Sistem generasi kode klien otomatis, untuk banyak bahasa pemrograman. +* Tersedia 2 antarmuka web dokumentasi interaktif secara langsung. + +--- + +Kita baru saja menyentuh permukaan, tetapi kamu sudah mendapatkan gambaran bagaimana semuanya berfungsi. + +Coba ubah baris dengan: + +```Python + return {"item_name": item.name, "item_id": item_id} +``` + +...dari: + +```Python + ... "item_name": item.name ... +``` + +...menjadi: + +```Python + ... "item_price": item.price ... +``` + +...dan lihat bagaimana editor kamu akan menyelesaikan otomatis atribut-atribut tersebut dan mengetahui tipe mereka: + +![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) + +Untuk contoh yang lebih lengkap termasuk lebih banyak fitur, lihat Tutorial - Panduan Pengguna. + +**Peringatan Spoiler**: tutorial - panduan pengguna termasuk: + +* Deklarasi **parameter** dari tempat lain seperti: **headers**, **cookies**, **form fields**, dan **files**. +* Cara mengatur **konstrain validasi** seperti `maximum_length` atau `regex. +* Sangat kuat dan mudah di gunakan **Dependency Injection** sistem. +* Keamanan dan otentikasi, termasuk dukungan untuk **OAuth2** dengan token **JWT** dan otentikasi **HTTP Basic**. +* Teknik yang lebih advanced (namun sama mudahnya) untuk mendeklarasikan **model JSON yang bersarang secara mendalam** (berkat Pydantic). +* **GraphQL** intergrasi dengan Strawberry dan perpustakaan lainnya. +* Banyak fitur tambahan (berkat Starlette) seperti: + * **WebSockets** + * pengujian yang sangat mudah berdasarkan HTTPX dan `pytest` + * **CORS** + * **Cookie Sessions** + * ...dll. + +## Performa + +Benchmarks independen dari TechEmpower menunjukkan aplikasi **FastAPI** yang berjalan di bawah Uvicorn sebagai salah satu _framework_ Python tercepat yang tersedia, hanya di bawah Starlette dan Uvicorn sendiri (digunakan secara internal oleh FastAPI) (*) + +Untuk memahaminya lebih lanjut, lihat bagian Benchmarks. + +## Dependensi Opsional + +Digunakan oleh Pydantic: + +* email_validator - untuk validasi email. +* pydantic-settings - untuk manajemen pengaturan. +* pydantic-extra-types - untuk jenis tambahan yang akan digunakan dengan Pydantic. + +Digunakan oleh Starlette: + +* httpx - Diperlukan jika kamu ingin menggunakan `TestClient`. +* jinja2 - Diperlukan jika kamu ingin menggunakan konfigurasi templat default. +* python-multipart - Diperlukan jika kamu ingin mendukung _form_ "parsing", dengan `request.form()`. +* itsdangerous - Diperlukan untuk `SessionMiddleware`. +* pyyaml - Diperlukan untuk Starlette's `SchemaGenerator` (kamu mungkin tidak memerlukannya dengan FastAPI). +* ujson - Diperlukan jika kamu ingin menggunakan `UJSONResponse`. + +Digunakan oleh FastAPI / Starlette: + +* uvicorn - Untuk server yang memuat dan melayani aplikasi kamu. +* orjson - Diperlukan jika kamu ingin menggunakan `ORJSONResponse`. + + +Kamu dapat menginstal semuanya dengan `pip install "fastapi[all]"`. + +## Lisensi + +Proyek ini dilisensikan di bawah ketentuan lisensi MIT.