Membangun REST API dengan Flask

Membangun REST API dengan Flask

Sun Jun 07 2026
594 words · 6 minutes

Di artikel ini, kita akan membahas cara membangun REST API yang profesional menggunakan Flask, dengan praktik terbaik terkini (2026). Kita akan menggunakan pendekatan yang terstruktur, termasuk dokumentasi otomatis, validasi, error handling, dan keamanan.


1. Mengapa Flask Cocok untuk REST API?

Keunggulan Flask untuk membangun REST API:

  • Ringan dan cepat
  • Tidak memaksakan struktur tertentu
  • Ekosistem ekstensi yang matang (Flask-RESTX, Flask-JWT-Extended, dll)
  • Mudah diintegrasikan dengan database dan tools lain
  • Cocok untuk microservices maupun monolithic API

2. Stack yang Direkomendasikan

Untuk REST API yang solid, gunakan kombinasi berikut:

KomponenPaketFungsi
Web FrameworkFlaskInti aplikasi
REST ExtensionFlask-RESTXResource, routing, Swagger UI otomatis
DatabaseFlask-SQLAlchemyORM
Serializationmarshmallow / Flask-MarshmallowValidasi & serialisasi data
AuthenticationFlask-JWT-ExtendedJWT token authentication
MigrationFlask-MigrateDatabase migration
ValidationmarshmallowSchema validation

3. Struktur Proyek REST API

Struktur yang bersih dan scalable sangat penting:

api_project/
├── app/
│ ├── __init__.py
│ ├── api/
│ │ ├── __init__.py
│ │ ├── v1/
│ │ │ ├── __init__.py
│ │ │ ├── users.py
│ │ │ └── posts.py
│ │ └── __init__.py
│ ├── models.py
│ └── schemas.py
├── config.py
├── requirements.txt
└── run.py

4. Instalasi Dependensi

Terminal window
pip install flask flask-restx flask-sqlalchemy flask-jwt-extended flask-migrate marshmallow

5. Inisialisasi Aplikasi dan Flask-RESTX

app/__init__.py

from flask import Flask
from flask_restx import Api
from flask_sqlalchemy import SQLAlchemy
from flask_jwt_extended import JWTManager
db = SQLAlchemy()
jwt = JWTManager()
api = Api(
title='My REST API',
version='1.0',
description='A simple REST API built with Flask',
doc='/docs' # Swagger UI akan tersedia di /docs
)
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
db.init_app(app)
jwt.init_app(app)
api.init_app(app)
# Register namespaces
from .api.v1.users import ns as users_ns
from .api.v1.posts import ns as posts_ns
api.add_namespace(users_ns, path='/api/v1/users')
api.add_namespace(posts_ns, path='/api/v1/posts')
return app

6. Membuat Resource (Endpoint)

app/api/v1/users.py

from flask_restx import Namespace, Resource, fields
from flask_jwt_extended import jwt_required, get_jwt_identity
from app.models import User
from app import db
ns = Namespace('users', description='User operations')
user_model = ns.model('User', {
'id': fields.Integer(readonly=True),
'username': fields.String(required=True),
'email': fields.String(required=True),
})
@ns.route('/')
class UserList(Resource):
@ns.doc('list_users')
@ns.marshal_list_with(user_model)
@jwt_required()
def get(self):
"""List all users"""
users = User.query.all()
return users
@ns.doc('create_user')
@ns.expect(user_model)
@ns.marshal_with(user_model, code=201)
def post(self):
"""Create a new user"""
data = ns.payload
user = User(username=data['username'], email=data['email'])
db.session.add(user)
db.session.commit()
return user, 201
@ns.route('/<int:id>')
class UserResource(Resource):
@ns.doc('get_user')
@ns.marshal_with(user_model)
def get(self, id):
"""Get a user by ID"""
user = User.query.get_or_404(id)
return user

7. Request Parsing & Validation

Flask-RESTX menyediakan reqparse dan fields untuk validasi.

Contoh dengan reqparse:

from flask_restx import reqparse
parser = reqparse.RequestParser()
parser.add_argument('username', type=str, required=True, help='Username is required')
parser.add_argument('email', type=str, required=True)
@ns.route('/')
class UserList(Resource):
def post(self):
args = parser.parse_args()
# proses data

Untuk validasi yang lebih powerful, gunakan marshmallow.


8. Error Handling yang Baik

from flask_restx import abort
@ns.route('/<int:id>')
class UserResource(Resource):
def get(self, id):
user = User.query.get(id)
if not user:
abort(404, message="User not found")
return user

Anda juga bisa membuat custom error handler global.


9. Authentication dengan JWT

Login Endpoint (contoh)

from flask_jwt_extended import create_access_token
@ns.route('/login')
class Login(Resource):
def post(self):
data = ns.payload
user = User.query.filter_by(email=data['email']).first()
if user and user.verify_password(data['password']):
access_token = create_access_token(identity=user.id)
return {'access_token': access_token}, 200
return {'message': 'Invalid credentials'}, 401

Kemudian lindungi endpoint dengan @jwt_required().


10. Best Practices REST API dengan Flask

PraktikRekomendasi
VersioningSelalu gunakan versioning di URL (/api/v1/)
DokumentasiGunakan Flask-RESTX (Swagger UI otomatis)
Status CodeGunakan kode HTTP yang tepat (200, 201, 404, 401, 403, 500)
PaginationImplementasikan pagination untuk data besar
Filtering & SortingDukung query parameter ?page=1&per_page=10&sort=-created_at
Error ResponseKembalikan error dalam format JSON yang konsisten
Rate LimitingGunakan Flask-Limiter untuk production
CORSAktifkan CORS jika API diakses dari frontend berbeda domain

11. Contoh Response yang Baik

Success Response:

{
"data": {
"id": 1,
"username": "rifki",
"email": "rifki@example.com"
},
"message": "User created successfully"
}

Error Response:

{
"error": "Not Found",
"message": "User with id 99 not found",
"status_code": 404
}

Kesimpulan

Membangun REST API dengan Flask memberikan kebebasan dan kontrol penuh kepada developer. Dengan menggunakan Flask-RESTX, kita mendapatkan:

  • Routing yang bersih
  • Dokumentasi otomatis (Swagger UI)
  • Validasi request yang mudah
  • Struktur yang scalable

Kombinasikan dengan JWT untuk autentikasi dan marshmallow untuk serialisasi yang kuat, maka Anda akan memiliki REST API yang siap production.

REST API yang baik tidak hanya tentang endpoint yang berfungsi, tetapi juga tentang konsistensi, dokumentasi, keamanan, dan kemudahan pemeliharaan.


Thanks for reading!

Membangun REST API dengan Flask

Sun Jun 07 2026
594 words · 6 minutes