<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های yasinrezaei</title>
        <link>https://virgool.io/feed/@yasinrezaei</link>
        <description>Data Engineer</description>
        <language>fa</language>
        <pubDate>2026-06-17 00:21:54</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/67133/avatar/Ukrtpx.jpg?height=120&amp;width=120</url>
            <title>yasinrezaei</title>
            <link>https://virgool.io/@yasinrezaei</link>
        </image>

                    <item>
                <title>آشنایی با رست فریمورک جنگو (Django Rest FrameWork)</title>
                <link>https://virgool.io/@yasinrezaei/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-%D8%B1%D8%B3%D8%AA-%D9%81%D8%B1%DB%8C%D9%85%D9%88%D8%B1%DA%A9-%D8%AC%D9%86%DA%AF%D9%88-django-rest-framework-fcfe821md4w1</link>
                <description>تو این پست نگاهی خواهیم داشت به Django Rest FrameWork یا به اختصار DRF داخل پست قبلی توضیحاتی در رابطه با این که API چی هست دادم که میتونید قبل از خوندن این پست نگاهی بهش بندازید.خوب برای شروع بهتره که اول یه سری بزنیم به سایت اصلی DRF https://www.django-rest-framework.orgیه سری توضیحات اولیه داده در مورد web api ها و اینکه چرا و کجا استفادشون میکنیم و بعد پکیج های لازم برای اینکه بتونیم در واقع DRF  رو روی پروژه جنگو خودمون پیاده کنیم رو معرفی کرده که اینجوری میتونید نصبش کنید :1-پایتون و pip رو حتما باید اول نصب کنید2-نصب پکیج های زیر :pip install djangopip install djangorestframework
و یه سری پکیج دیگه که بر حسب نیاز در ادامه باید نصب کنید  اما , اصلا به چه دردی میخوره این DRF :)بزارید یه مثال ساده بزنم فرض کنید چند مدت پیش اومدید و برای خودتون با استفاده از جنگو (یا هر فریمورک دیگه ای  ) یه سایت زدید اما حالا قصد دارید که برای همون سایتتون اپ اندروید هم بزنید ، خوب کار معقولانه اینه که شما بتونید همه اطلاعاتی که روی  دیتابیس سایتتون هست رو از یه طریقی داخل اپ اتون نشون بدید برای این کار میاید و یک سری API تنظیم میکنید تا بتونید هر سری با درخواست دادن به اون اطلاعات مورد نیازتون رو داخل اپ اندروید داشته باشید . بنابراین شما بدون نیاز به اینکه دیتابیس جدیدی برای اپ اندرویدتون داشته باشید میتونید تمامی اطلاعات سایتتون رو داخل اون نمایش بدید.تصویر زیر رو ببینید اطلاعات شما داخل یک دیتابیس قرار گرفته ولی در تمامی نسخه های نرم افزاری میتونید ازش استفاده کنیدبنابراین وقتی مثلا داخل وبسایت شما تغییری در دیتابیس ایجاد میشود همین تغییرات درنسخه اندروید نیز ایجاد خواهد شد ، بنابراین API ابزاری هست که اطلاعات رو بر حسب نیاز ما از دیتابیس استخراج میکند و به ما ارائه میدهد و یا اطلاعات جدیدی را به دیتابیس اضافه میکند.خوب ، یواش یواش بریم سراغ اینکه داخل یه پروژه عملی نحوه ساختن api هارو در رست فریمورک جنگو ببینیم اگر قبلا با جنگو کار کرده باشید قطعا میدونید که modelچی هست اگرهم نه که بخوام ساده توضیح بدم شما برای این که جدول های داخل دیتابیس رو در جنگو آماده سازی کنید لازم نیست که مستقیما کد های دیتابیس بزنید و میتوانید با استفاده از مدل ها ساختار جدول هاتون و فیلد هاش رو مشخص کنید و با استفاده از دستور migrate  خود پایتون اون هارو مستقیما به کد دیتابیس که به صورت پیش فرض در جنگو دیتابیس sqlite  هست تبدیل میکند .توضیحات بیشتر models در اینجااگر جنگو را روی دستگاه خودتون نصب داشته باشید با استفاده از دستور زیر در cmd میتونید پروژه خودت رو ایجاد کنید django-admin startproject project_nameسپس میتونید وارد  پوشه پروژه تون بشید و با  دستور زیر یک اپلیکیشن ایجاد کنید python manage.py startapp app_nameاینجا براتون در رابطه با ساخت پروژه جنگو بیشتر توضیح داده :)باید برای این که بتونیم از DRF استفاده کنیم اپ rest_framework را هم  به همراه اپی که در بالا ساختیم در فایل settings.py به قسمت INSTALLED_APPS اضافه کنیم در ادامه لازمه که مدل خودمون(جدول های دیتابیس ) رو آماده کنیم تا بعد بتونیم برای همین دیتابیس API های دلخواهمون رو بنویسیم من نمونه کد هارو از قسمت هایی از پروژه ای که این روز ها درگیرش هستم برای آشنایی بیشتر شما میارم :فایل models.pyهمینطور که میبیند مدل Group دارای 4 فیلد هست که یکی از اون ها به صورت manytomany هست که باز اگر خواستید بیشتر باهاش آشنا بشید به اینجا سر بزنید این مدل بعد از migrate شدن یک جدول از دیتابیس خواهد شد و من میتونم از طریق پنل ادمین اطلاعات خودم را داخلش ذخیره کنمبعد از اینکه یک مدل رو ساختیم باید براش serializer بسازیم توضیح ساده اش اینه که بتونیم مکانیزمی را فراهم کنیم که  اطلاعات مدل های ایجاد شده در جنگو را به فرمتی در بیاریم که به راحتی قابل استفاده باشند مثل JSON و بالعکس.برای اینکار یک فایل serializers.py در هر اپلیکیشنی که در واقع میخواید مدل های اون رو serialize کنید ،ایجاد کنید موارد زیر را به اون اضافه کنید from rest_framework import serializers
from .models import Group #مدلی که میخواهید سریالایز کنیددر ادامه یک کلاس GroupSerializer ایجاد میکنیم و داخل اون مدل و فیلد هایی که میخواهیم سریالایز شود را اضافه میکنیم میتوانیم تنها فیلد های دلخواهمون رو اضافه کنیم به صورت زیر :بعد از این مرحله باید داخل فایل Views.py بریم و موارد زیر را اضافه کنیم:from rest_framework.decorators import api_view #   GET PUT POST , ..... نوع در خواست from rest_framework.response import Response #ارسال پاسخ ها from rest_framework import status #مشخص کردن وضعیت یک درخواستfrom .models import Group#مدل هایی که میخواهیم سریالایز کنیمfrom .serializers import GroupSerializer # سریالایز که در مرحله قبل نوشتیمدر مثال بالا نوع درخواست ارسال شده به سمت سرور GET می باشد از مدل Group تمام اطلاعاتش را دریافت میکنیم وداخل متغیر groups میریزیماطلاعات را به سریالایزر میدهیم و خروجی که شامل دیتای مناسب برای پاسخ هست را ارسال میکنیماز status.HTTP_200_OK به معنای درست بودن وضعیت استفاده میکنیم لیست همه استاتوس هارو اینجا میتونید ببیند و لیست متد های HTTP رو هم در تصویر زیر میتونید ببیند لیست متدهای HTTPبعد از این مرحله باید url های لازم رو ایجادکنیم داخل فایل urls.py از path زیر استفاده میکنیم و متد get_groups که داخل فایل views  نوشته شده را اینجا اضافه میکنیم  : path(&#039;get-groups&#039;,views.get_groups)***بعضی جا ها شما نمیخواهید که این APIها در اختیار عموم قرار بگیرد و تنها کسی که مثلا لاگین کرده باشد و یا ادمین سایت باشد بتواند به این ها دسترسی داشته باشد برای این که بتوانید این محدودیت هارا قائل شوید باید از permission  های مربوط به rest استفاده کنید که اینجا میتوانید اطلاعات بیشتری از permission ها کسب کنید  برای نمونه من فقط به کسانی که داخل سایت لاگین کرده اند و یا ادمین هستند این اجازه را میدهم برای این کار داخل فایل settings.py از دستورات  زیر استفاده میکنمدر بعضی مواقع خود شما هم میتوانید  میتوانید permission های شخصی سازی شده خودتون رو بنویسید برای این کار هم یک فایل permissions.py  داخل اپ مورد نظرتون ایجاد کنید و به صورت زیر دسترسی های شخصی سازی شده رو اعمال کنید من در این فایل یک Permission با نام IsOwner میسازم :فایل permissions.pyو سپس داخل view هایی که قبلا نوشته اید IsOwner رو به صورت زیر اضافه کنید   :خوب در نهایت برای دیدن نحوه کار کردن این API ها هم میتوانید از خوده محیطی که جنگو برای rest فراهم کرده استفاده کنید و هم از نرم افزار معروف Postmanبرای شروع پروژه خودتون رو ران کنید python manage.py runserverاز local host استفاده کنید که به صورت 127.0.0.1:8000 هستاگر آدرس زیر رو بزنید داخل مرورگر در ابتدا چون لاگین صورت نگرفته و permission داده نشده به چیزی که میبنیم به این صورت است http://127.0.0.1:8000/elmi/get-groupsاما پس از لاگین کردن خروجی به صورت JSON است که اطلاعات تمام گروه هارا نشان میدهد***این یک مثال اولیه و ساده بود از Django RestFramework و بیشتر جنبه آشنایی داشت و پست آموزشی نبود و امیدوارم کلیت کار دستتون اومده باشه و بتونید با سرچ زدن و استفاده از داکیومنت های اصلی خود DRF  پروژه های خوبی رو داشته باشید :)خوب سلام دوباره، بکم آپدیت :)توی داکیومنت های  جدید  djando rest framework  میتونید در مورد Generic View  ها و viewset ها بیشتر بخونید ، چون خیلی سرعت توسعه با این روش ها بیشتر و بهتر شده و به نظرم واجبه که در موردشون مطالعه داشته باشیدمن سعی میکنم در ادامه یه نمونه از Concrete View Classes  رو براتون توضیح بدم  باشد که رستگار شوید  :  مدلی که برای این مثال داریم به صورت زیره :class Post(models.Model):
         author = models.ForeignKey(User,on_delete=models.CASCADE)
         title = models.CharField(max_length=250)
         content = models.TextField()
         status = models.BooleanField()
         category = models.ForeignKey(&amp;quotCategory&amp;quot,on_delete=models.SET_NULL,null=True)
         created_date = models.DateTimeField(auto_now_add=True)
         updated_date = models.DateTimeField(auto_now=True)
         def __str__(self):
                  return self.titleبیاید به این چند خط کد در فایل views.py نگاه کنید تا بعدش توضیح بدم چه اتفاقی میفته :from rest_framework.permissions import IsAuthenticated,IsAuthenticatedOrReadOnly

from rest_framework.views import APIViewfrom rest_framework.generics import ListAPIView,RetrieveUpdateAPIView,ListCreateAPIView,DestroyAPIView,UpdateAPIView,CreateAPIView,RetrieveUpdateDestroyAPIView

from .permissions import IsOwnerOrReadOnly

from django_filters.rest_framework import DjangoFilterBackend

from rest_framework.filters import SearchFilter,OrderingFilterclass PostList(ListCreateAPIView):
                permission_classes = [IsAuthenticatedOrReadOnly]
               serializer_class = PostSerializer
               queryset = Post.objects.all()

               filter_backends = [DjangoFilterBackend,SearchFilter,OrderingFilter]
              filterset_fields = {
                            &amp;quotcategory&amp;quot: [&amp;quotin&amp;quot, &amp;quotexact&amp;quot]
              }
              search_fields = [&#039;title&#039;,&#039;content&#039;]
              ordering_fields = [&#039;created_date&#039;]class PostDetail(RetrieveUpdateDestroyAPIView):
               permission_classes = [IsOwnerOrReadOnly]
               queryset = Post.objects.filter(status = True)
               serializer_class = PostSerializerخوب همینطور که میبینید در وهله اول نوشتن view  ها خیلی راحت تر شده و یه سری ویژگی  های خوب دیگه مثل filters , search, ordering قابل استفاده استدر واقع شما برحسب نیاز خودتون باید اون class view  مناسب رو انتخاب کنید و ازش ارث بری داشته باشید، فقط همین، بقیه موارد رو خود django  کنترل میکنه .توی فایل url تون حواستون باشه که برای حالت get,update,delete  که برای یک object  هست حتما مقدار pk   را در url  ارسال کنید .path(&#039;post-list/&#039;,views.PostList.as_view(),name=&#039;post-list&#039;),
path(&#039;post-detail/&lt;int:pk&gt;/&#039;,views.PostDetail.as_view(),name=&#039;post-detail&#039;)در نهایت باز تاکید میکنم حتما داکیومنت اصلی خود django  و django rest  رو بخونید، این مقاله صرفا جهت دید اولیه شماست .اگر تجربه استفاده از rest رو داشته اید و یا منبع خوبی برای آموزش میشناسید این زیر معرفی کنید برای بقیه :)</description>
                <category>yasinrezaei</category>
                <author>yasinrezaei</author>
                <pubDate>Tue, 06 Apr 2021 20:04:23 +0430</pubDate>
            </item>
                    <item>
                <title>API</title>
                <link>https://virgool.io/@yasinrezaei/api1-b6g9zidi7oaf</link>
                <description>Application Programming Interface                                     رابط برنامه‌نویسی اپلیکیشنبیاید با یک مثال شروع کنیم :به یک منو در رستورانی فکر کنید ، در این فهرست لیستی از غذا های قابل سفارش را به همراه توضیحات اون میتونید ببینید .وقتی مشخص میکنید که چه آیتم هایی از منو را میخواهید ،آشپزخانه رستوران اونو برای شما آماده میکنه .شما دقیقا نمیدونید که رستوران چگونه اون غذا را تهیه می کنه و نیازی هم به فهمیدن این موضوع ندارید.بزارید یه مثال تخصصی تر بزنیم:فرض کنید شما یک توسعه دهنده نرم افزار هستید و میخواهید یک برنامه برای سیتم عامل iosبنویسید ،اگر بخواهید که یک مرورگر وب را برای نشان دادن یک یا چند صفحه وب در برنامه تان جاسازی کنید آیا لازمه که از ابتدا یک مرورگر وب برای برنامه خودتون آماده کنید ؟قطعا جواب خیر هست و شما میتونید از API مربوط به مروگر safari برای جاسازی یک شی مرورگر در برنامه خودتون استفاده کنید.این برای هر سیستم عاملی صدق میکند .به عنوان مثال اگر بخواهید یک کادر محاوره ای در ویندوز ایجاد کنید میتوانید از APIهای اختصاصی که مایکروسافت برای ویندوز عرضه کرده هست استفاده کنید.فرض کنید اگر مایکروسافت اقدام به عرضه این APIها برای توسعه دهندگان نمی کرد ، در چنین فضایی هر دولوپر مجبور میشد تا بسته به نیاز و سلیقه خودش  اقدام به طراحی پنجره هایی بکنه و این مساله منجر می شه که یکپارچگی ظاهری بین نرم افزار های مختلف از بین میره، API ها به دلایل دیگری هم مورد استفاده قرار میگیرند مثلا اگه از نرم افزاری در موبایلتون استفاده میکنید که در آن از google maps برای نشان دادن نقشه استفاده می شود در واقع این نرم افزار از google maps api  و در صورت عدم استفاده از این APIها خود توسعه دهندگان نرم افزار باید نقشه های خود را ایجاد کرده و داده ها را روی آن پیاده کنند. بنابراین API ها اجازه می دهند که محصول یا خدمات شما با سایر محصولات و خدمات ارتباط برقرار کنند ، بدون اینکه بدونند چگونه اونا پیاده سازی شده اند واین میتونه توسعه برنامه ،صرفه جویی در وقت و هزینه را آسان تر بکنه.کار با API ها تقریبا آسونه چون دیتا های مبادله شده ساختار یافته اند ، یعنی درخواست ها در یک چارچوب و فرمت استاندارد تعریف شده اند و نتیجه تعامل با API ها قابل پیش بینی هست.خوب حالا که تقریبا با مفهوم API  آشنا شدیم بریم سراغ بررسی جزئی تر اون :انواع مختلف API ها:ای‌پی‌آی سخت‌افزاریبه عنوان مثال یک توسعه دهنده میتونه با استفاده از API های سخت افزاری موجود در سیستم عامل به دوربین موبایل و یا سنسور GPS دسترسی داشته باشه و از اون در نرم افزار های خودش استفاده کنه.ای‌پی‌آی سیستم‌عاملیکه پیش از این درقالب توسعه نرم افزار های دسکتاپ توضیح دادم.ای‌پی‌آی زبان‌های برنامه‌نویسیبه عنوان مثال استفاده از API های java  که فیچر های تکمیلی را در اختیار توسعه دهندگان میذاره.ای‌پی‌آی تحت وب (وب سرویس)متداول ترین و کاربردی ترین انواع API ها هستند که در پست های بعدی بیشتر با اون ها آشنا میشیم.دسته بندی API ها بر اساس ابعاد دسترسی :1-open APIsتحت عنوان API های عمومی شناخته میشوند و محدودیتی در دسترسی به اونا وجود نداره.2-partner APIsاین API ها صرفا در اختیار کسب و کار ها هستند ،معمولا پولی هستند و برای دسترسی به این ها یک توسعه دهنده نیاز به مجوز های خاصی داره چون در دسترس عموم نیست.3-internal APIsبه عنوان API های خصوصی شناخته می شوند و برای سیستم های داخلی یک شرکت طراحی میشوند و تیم های مختلف داخلی یک سازمان میتونند از این نوع API ها استفاده کنند تا محصولات و خدماتشون رو بهبود ببخشند.4-composite APIsاین APIها یک روش طراحی برای درخواست دسته های API پی در پی هستند یعنی تعداد بیشتری موارد استفاده ارائه می دهند و میتوان با یک ارسال درخواست زنجیره ای از تماس ها را انجام داد و یک پاسخ دریافت کردبزارید یک مثال بزنم :برای ایجاد سفارش در یک API سبد خرید ممکن است به چندین نقطه پایانی نیاز داشته باشیم :*ایجاد سفارش*اضافه کردن مورد به سفارش*تغییر وضعیت سفارش*و ....و برای ایجاد یک سفارش باید این تماس هارا پشت سر هم انجام دهیم.خوب تا به اینجای کار با یه سری جزئیات آشنا شدیم و بقیه توضیحات رو میزارم برای پست بعدی و برای تموم کردن این پست میخوام یه نمونه عملی ساده از کار کردن با API ها  در پایتون رو انجام بدیم.میخوایم یه برنامه ساده بنویسم که به صورت انلاین قیمت ارز های دیجیتال رو برامون بنویسه :)خوب برای اینکه بتونیم به یه سری API های باز دسترسی داشته باشیم میتونیم از حساب گیت هاب زیر استفاده کنیم:https://github.com/public-apis/public-apisو اونجا از قسمت crypto curency  میتونیم به APIهای مربوط به ارز های دیجیتال دسترسی پیدا کنیم.برای مثال من از APIهای مربوط به سایت COINLORE استفاده میکنم ، اولین کاری که باید بکنیم اینه که داکیومنت مربوط به اون APIکه میخوایم باهاش کار کنیم رو کامل بخونیم به عنوان مثال برای اینکه به اطلاعات صد ارز دیجیتال با ارزش دسترسی پیدا کنیم باید به این صورت عمل کنیمخوب بعد از تسلط کامل بر داکیومنت میتونیم برنامه مورد نظر خودمون رو بنویسیم:برای شروع کار لازمه که یه سری کتابخونه پایتون نصب کنیم تا بتونیم راحت تر باهاش کار کنیم برای درخواست دادن به هر URL  در پایتون میتونیم از کتابخونه request  استفاده کنیمهمینطور برای نمایش زمان از کتابخونه time استفاده میکنیم.import requestsimport timeخوب برای این که ظاهر خوبی به برناممون بدیم یکم رنگیش میکنیم :)class bcolors:             HEADER = &#039;\033[95m&#039;             OKBLUE = &#039;\033[94m&#039;             OKGREEN = &#039;\033[92m&#039;             WARNING = &#039;\033[93m&#039;              FAIL = &#039;\033[91m&#039;              ENDC = &#039;\033[0m&#039;              BOLD = &#039;\033[1m&#039;              UNDERLINE = &#039;\033[4m&#039;خوب حالا با استفاده از کتابخونه request  یک در خواست به API مورد نظرمون ارسال میکنیم:res=requests.get(&#039;https://api.coinlore.net/api/tickers/?start=0&amp;limit=10&#039;)و زمان این درخواست رو هم به این صورت به دست میاریم :localtime = time.asctime( time.localtime(time.time()) )حالا میتونیم ظاهر برنامه مون رو درست کنیم و اطلاعاتی که به دست اوردیم رو چاپ کنیم :import requestsimport timeimport matplotlib.pyplot as pltclass bcolors:      HEADER = &#039;\033[95m&#039;      OKBLUE = &#039;\033[94m&#039;      OKGREEN = &#039;\033[92m&#039;      WARNING = &#039;\033[93m&#039;      FAIL = &#039;\033[91m&#039;      ENDC = &#039;\033[0m&#039;      BOLD = &#039;\033[1m&#039;      UNDERLINE = &#039;\033[4m&#039;
#ارسال درخواستres=requests.get(&#039;https://api.coinlore.net/api/tickers/?start=0&amp;limit=10&#039;)print(bcolors.OKGREEN+&amp;quot---------cryptocurrency data---------&amp;quot+ bcolors.ENDC)
#چاپ کردن چهار ارز باارزش اولfor i in range(0,4):      print(bcolors.OKBLUE,res.json()[&#039;data&#039;][i][&#039;rank&#039;],bcolors.ENDC,end=&amp;quot&amp;quot)      print(res.json()[&#039;data&#039;][i][&#039;nameid&#039;],&amp;quot\t&amp;quot,res.json()[&#039;data&#039;][i][&#039;price_usd&#039;],&amp;quot$&amp;quot)      print(bcolors.OKGREEN+&amp;quot------------------------------------&amp;quot+bcolors.ENDC)
#به دست اوردن زمان انجام درخواستlocaltime = time.asctime( time.localtime(time.time()) )print(bcolors.WARNING+&amp;quotLocal current time :&amp;quot, localtime,&amp;quot&amp;quot+bcolors.ENDC)print(bcolors.OKGREEN+&amp;quot------------------------------------&amp;quot+bcolors.ENDC)در نهایت خروجی برنامه به صورت زیر خواهد بود :این یه نمونه ساده از کار با API ها بود ، شما هم میتونید کلی کار جالب و راحت با API ها انجام بدید و لذت ببرید :)داخل پست بعدی در رابطه با نحوه ساخت API با استفاده از فریمورک  Django  توضیح دادم .</description>
                <category>yasinrezaei</category>
                <author>yasinrezaei</author>
                <pubDate>Fri, 21 Aug 2020 12:51:41 +0430</pubDate>
            </item>
            </channel>
</rss>