راهاندازی API وبسایت AliZakaee.ir با Django REST Framework
باز کردن دادهها از دل یک وبسایت، و قابلاستفاده کردن آنها برای برنامهها و سرویسهای دیگر، یکی از مهمترین کارهایی است که میشود برای توسعهپذیرتر کردن یک پروژه انجام داد. به همین دلیل تصمیم گرفتم برای وبسایتم AliZakaee.ir یک API ساده و تمیز بسازم تا محتوای بلاگ را به صورت ساختیافته (JSON) در اختیار دیگران قرار بدهم.
در این پست توضیح میدهم:
- API سایت دقیقاً چه شکلی است و از کجا قابل دسترسی است
- با چه تکنولوژی ساخته شده
- به صورت خلاصه چطور آن را پیادهسازی کردم
- و چطور میتوانید از آن در پروژههای خودتان استفاده کنید
نگاهی به API فعلی سایت
روت اصلی API
آدرس اصلی API این است:
https://alizakaee.ir/api/اگر این آدرس را در مرورگر باز کنید، یک صفحهی استاندارد مربوط به Django REST Framework میبینید که روت API را نمایش میدهد. در حال حاضر، این روت یک ریسورس اصلی به نام posts را معرفی میکند:
{
"posts": "https://alizakaee.ir/api/posts/"
}این یعنی تمام پستهای بلاگ، از طریق این آدرس قابل خواندن هستند.
لیست پستها: /api/posts/
اگر به آدرس زیر بروید:
https://alizakaee.ir/api/posts/خروجی به صورت یک آرایه از آبجکتهای JSON است؛ هر آبجکت، نمایندهی یک پست در وبسایت است. به عنوان مثال، ساختار تقریبی هر پست چیزی شبیه این است:
{
"id": 8,
"title": "NLP؛ زبان مشترک انسان و ماشین",
"content": "<h2><strong>مقدمه</strong></h2>...",
"author": 1,
"views": 47,
"slug": "nlp-زبان-مشترک-انسان-و-ماشین",
"created_date": "2025-10-16T15:11:38.079775+03:30",
"updated_date": "2025-10-16T15:11:38.079820+03:30"
}چند نکته مهم:
- فیلد
contentبه صورت HTML ذخیره شده؛ یعنی اگر آن را داخل یک وباپ نمایش دهید، فقط کافی است HTML را رندر کنید. slugهمان مسیری است که در URL پستها استفاده میشود.created_dateوupdated_dateتاریخ ایجاد و آخرین بروزرسانی پست هستند (به همراه timezone).
این endpoint فعلاً read-only است و متدهای مجاز در آن GET، HEAD و OPTIONS هستند؛ یعنی کاربران عمومی فقط میتوانند دادهها را بخوانند، نه تغییر دهند.
چرا برای وبسایت API ساختم؟
چند دلیل اصلی:
قابلیت استفاده مجدد از محتوا
با داشتن API، محتوای بلاگ فقط محدود به تم فعلی سایت نیست. میتوان از همین محتوا در:- اپلیکیشن موبایل
- وباپلیکیشنهای دیگر
- پروژههای شخصی یا نمونهکارها
استفاده کرد.
- اتصال راحت به سرویسهای دیگر
مثلاً میتوان:- محتوای جدید را به صورت خودکار در جاهای دیگر سینک کرد
- داشبوردهای شخصی برای آمار بازدید و تحلیل محتوا ساخت
- تمرین معماری تمیز بکاند
پیادهسازی API با Django REST Framework کمک میکند بکاند ساختارمندتر و تمیزتری داشته باشد، جدا از لایهی فرانتاند.
تکنولوژی پشت API: Django REST Framework
این API با استفاده از Django و بستهی محبوب Django REST Framework (DRF) ساخته شده است. DRF امکانات زیر را فراهم میکند:
- ساخت سریع endpointهای RESTful
- امکانات پیشفرض برای:
- serialization (تبدیل Model به JSON و برعکس)
- pagination
- authentication و permission
- رابط کاربری وب برای تست و دیباگ API (همانی که الان در
/api/و/api/posts/میبینید)
پیادهسازی API: از مدل تا endpoint
در این بخش، به صورت خلاصه روند پیادهسازی را توضیح میدهم. (کدها نمونهاند، اما با ساختار فعلی سایت همخوانی دارند.)
۱. مدل Post در Django
# blog/models.py
from django.db import models
from django.contrib.auth.models import User
class Post(models.Model):
title = models.CharField(max_length=255)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
views = models.PositiveIntegerField(default=0)
slug = models.SlugField(unique=True)
created_date = models.DateTimeField(auto_now_add=True)
updated_date = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title۲. نصب و تنظیم Django REST Framework
در فایل settings.py:
INSTALLED_APPS = [
# ...
"rest_framework",
"blog",
]و یک تنظیم ساده برای شروع:
REST_FRAMEWORK = {
"DEFAULT_RENDERER_CLASSES": [
"rest_framework.renderers.JSONRenderer",
"rest_framework.renderers.BrowsableAPIRenderer",
],
}۳. ساخت Serializer برای Post
# blog/api/serializers.py
from rest_framework import serializers
from blog.models import Post
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = [
"id",
"title",
"content",
"author",
"views",
"slug",
"created_date",
"updated_date",
]۴. ViewSet و Router
# blog/api/views.py
from rest_framework import viewsets, mixins
from blog.models import Post
from .serializers import PostSerializer
class PostViewSet(mixins.ListModelMixin,
mixins.RetrieveModelMixin,
viewsets.GenericViewSet):
queryset = Post.objects.all().order_by("-created_date")
serializer_class = PostSerializerو در فایل urls.py مربوط به API:
# api/urls.py
from rest_framework.routers import DefaultRouter
from blog.api.views import PostViewSet
router = DefaultRouter()
router.register(r"posts", PostViewSet, basename="post")
urlpatterns = router.urlsدر نهایت، این urlpatterns را در urls.py اصلی پروژه، زیر یک prefix به نام api/ include کردهام:
# config/urls.py
from django.urls import path, include
urlpatterns = [
# ...
path("api/", include("api.urls")),
]نتیجه همان چیزی است که الان در آدرسهای زیر میبینید:
https://alizakaee.ir/api/https://alizakaee.ir/api/posts/
چطور از این API استفاده کنید؟
۱. درخواست ساده با مرورگر
سادهترین حالت، باز کردن آدرس در مرورگر است:
https://alizakaee.ir/api/posts/DRF به صورت خودکار یک رابط گرافیکی تحت وب نشان میدهد و میتوانید JSON را همانجا ببینید و تست کنید.
۲. استفاده با curl در ترمینال
curl https://alizakaee.ir/api/posts/خروجی یک آرایهی JSON از پستها خواهد بود.
۳. استفاده در جاوااسکریپت (فرانتاند یا وباپ)
مثال با fetch در مرورگر:
fetch("https://alizakaee.ir/api/posts/")
.then((res) => res.json())
.then((posts) => {
posts.forEach((post) => {
console.log(post.title, post.slug);
});
})
.catch((err) => console.error(err));یا در یک اپ React میتوانید از این API برای ساختن یک لیست داینامیک از پستها استفاده کنید.
قدمهای بعدی برای توسعه API
در حال حاضر API سایت به صورت عمومی و read-only در دسترس است. برای آینده میتوان چند قابلیت جذاب اضافه کرد:
- فیلتر و جستجو
مثلاً فیلتر بر اساسslug، تاریخ، تعداد بازدید یا جستجوی متنی در عنوانها. - pagination سمت سرور
برای زمانی که تعداد پستها زیاد شود، بهتر است پاسخها صفحهبندی شوند. - endpointهای بیشتر
مثلاً:- دستهبندیها (categories)
- تگها (tags)
- لیست محبوبترین پستها بر اساس
views
- محدودیت نرخ (Rate Limiting)
برای جلوگیری از سوءاستفاده و حفظ منابع سرور.
جمعبندی
در این نوشته، API وبسایت AliZakaee.ir را معرفی کردم؛ APIای که:
- با Django REST Framework پیادهسازی شده
- از طریق
/api/و مخصوصاً/api/posts/در دسترس است - دادههای بلاگ را به صورت JSON برمیگرداند و امکان استفاده از محتوای سایت را در اپها و سرویسهای دیگر فراهم میکند
اگر توسعهدهنده هستید، خوشحال میشوم از این API در پروژههای خودتان استفاده کنید، به آن وصل شوید، محتوا را تحلیل کنید، یا حتی روی آن ایدههای خلاقانه بسازید. اگر هم سؤال یا پیشنهادی برای توسعهی بیشتر API دارید، میتوانید از طریق راههای تماس داخل سایت به من بگویید. 🙌