جنگو چیست و چرا برای ساخت وب‌سایت فوق‌العاده است؟

امیرحسین بیگدلو 4 ماه قبل

 

 #  معرفی Django

این مقاله جنگو، به این سوال که "جنگو چیست؟" و یک نمای کلی از آنچه این چارچوب وب را خاص می کند به شما ارائه می دهد. ما ویژگی‌های اصلی، از جمله برخی از قابلیت‌های پیشرفته را بیان می‌کنیم. ما همچنین برخی از بلوک های اصلی یک برنامه جنگو را به شما نشان خواهیم داد.

 

دوره مرتبط: دوره اول آموزش جنگو(django)

 

 #  جنگو چیست؟

جنگو یک چارچوب وب سطح بالا پایتون است که امکان توسعه سریع وب سایت های امن و قابل نگهداری را فراهم می کند. جنگو که توسط توسعه دهندگان باتجربه ساخته شده است، از بسیاری از مشکلات توسعه وب مراقبت می کند، بنابراین می توانید بدون نیاز به اختراع مجدد چرخ، روی نوشتن برنامه خود تمرکز کنید. رایگان و منبع باز است، دارای یک جامعه پر رونق و فعال، اسناد عالی، و گزینه های زیادی برای پشتیبانی رایگان و پولی است.

 

جنگو به شما کمک می کند تا نرم افزارهایی بنویسید که:

 

 

 +  کامل هستند

جنگو از فلسفه "Batteries included" پیروی می کند و تقریباً هر کاری را که توسعه دهندگان ممکن است بخواهند انجام دهند را ارائه می دهد. از آنجایی که هر چیزی که نیاز دارید بخشی از یک "محصول" است، همه آنها به طور یکپارچه با هم کار می کنند، از اصول طراحی سازگار پیروی می کنند و دارای اسناد گسترده و به روز هستند.

 

 

 +  همه کاره هستند

جنگو می‌تواند برای ساختن تقریباً هر نوع وب‌سایتی (از سیستم‌های مدیریت محتوا و ویکی‌ها گرفته تا شبکه‌های اجتماعی و سایت‌های خبری) مورد استفاده قرار گیرد. جنگو می تواند با هر چارچوب سمت کلاینت کار کند و می تواند محتوا را تقریباً در هر قالبی (از جمله HTML، فیدهای RSS، JSON، XML و غیره) ارائه دهد. سایتی که هم اکنون می خوانید با جنگو ساخته شده است!

 

در داخل، در حالی که تقریباً برای هر عملکردی که ممکن است بخواهید (به عنوان مثال چندین پایگاه داده محبوب، موتورهای قالب و غیره) انتخاب هایی را ارائه می دهد، همچنین می تواند در صورت نیاز برای استفاده از اجزای دیگر گسترش یابد.

 

مقاله پیشنهادی: 11 اشتباه برنامه نویسان جنگو

 

 +  ایمن هستند

جنگو به توسعه‌دهندگان کمک می‌کند از بسیاری از اشتباهات امنیتی رایج با ارائه چارچوبی که برای «انجام کارهای درست» برای محافظت خودکار از وب‌سایت مهندسی شده است، اجتناب کنند. به عنوان مثال، جنگو روشی امن برای مدیریت حساب‌های کاربری و رمزهای عبور ارائه می‌کند، از اشتباهات رایج مانند قرار دادن اطلاعات سشن در کوکی‌ها در جایی که آسیب‌پذیر است اجتناب میکند در عوض کوکی‌ها فقط حاوی یک کلید هستند و داده‌های واقعی در پایگاه داده ذخیره می‌شوند یا از ذخیره مستقیم رمزهای عبور اجتناب می‌کند.

 

جنگو به طور پیش‌فرض محافظت در برابر بسیاری از آسیب‌پذیری‌ها، از جمله تزریق SQL، اسکریپت بین سایتی(xss)، جعل درخواست بین سایتی(csrf) و کلیک جک(clickjack) را امکان‌پذیر می‌کند.

 

 

 +  مقیاس پذیر هستند

جنگو از یک معماری مبتنی بر کامپوننت استفاده می‌کند (هر بخش از معماری مستقل از بقیه است و از این رو می‌تواند در صورت نیاز جایگزین یا تغییر داده شود). داشتن جدایی واضح بین بخش‌های مختلف به این معنی است که می‌تواند با افزودن سخت‌افزار در هر سطحی، برای افزایش ترافیک مقیاس‌بندی شود: سرورهای کش، سرورهای پایگاه داده یا سرورهای برنامه. برخی از شلوغ‌ترین سایت‌ها با موفقیت جنگو را برای برآورده کردن خواسته‌های خود افزایش داده‌اند (مانند اینستاگرام و Disqus).

 

مقاله پیشنهادی: چک لیست امنیتی برای قبل از دیپلوی جنگو

 

 +  قابل نگهداری هستند

کد جنگو با استفاده از اصول و الگوهای طراحی نوشته شده است که ایجاد کدهای قابل نگهداری و قابل استفاده مجدد را تشویق می کند. به طور خاص، از اصل خودت تکرار نکن (DRY) استفاده می کند، بنابراین تکرار غیرضروری وجود ندارد و مقدار کد را کاهش می دهد. جنگو همچنین گروه‌بندی عملکردهای مرتبط را به «برنامه‌های کاربردی» قابل استفاده مجدد و در سطح پایین‌تر، کدهای مرتبط را به ماژول‌ها (در امتداد خطوط الگوی کنترل‌کننده نمایش مدل (MVC) گروه‌بندی می‌کند.

 

 

 +  قابل حمل هستند

جنگو به زبان پایتون نوشته شده است که روی پلتفرم های زیادی اجرا می شود. این بدان معناست که شما به هیچ پلتفرم خاصی وابسته نیستید و می‌توانید برنامه‌های خود را بر روی انواع مختلفی از لینوکس، ویندوز، و Mac OS X اجرا کنید. علاوه بر این، جنگو توسط بسیاری از ارائه‌دهندگان میزبانی وب که اغلب زیرساخت‌های خاصی را ارائه می‌دهند، به خوبی پشتیبانی می‌شود.

 

مقاله پیشنهادی: تست برنامه‌های جنگوی شما با pytest

 

 #  جنگو از کجا آمده است؟

جنگو در ابتدا بین سال‌های 2003 و 2005 توسط یک تیم وب که مسئول ایجاد و نگهداری وب‌سایت‌های روزنامه‌‌ای بودند، توسعه یافت. پس از ایجاد تعدادی سایت، تیم شروع به فاکتورسازی و استفاده مجدد از بسیاری از کدهای رایج و الگوهای طراحی کرد. این کد رایج به یک چارچوب توسعه وب عمومی تبدیل شد که در جولای 2005 به عنوان پروژه "جنگو" منبع باز شد.

 

جنگو از اولین نسخه نقطه عطف خود (1.0) در سپتامبر 2008 تا الآن به رشد و پیشرفت خود ادامه داده است. هر نسخه قابلیت‌ها و رفع اشکال‌های جدیدی را اضافه کرده است، از پشتیبانی از انواع جدید پایگاه‌های داده، موتورهای قالب(template engines)، و حافظه پنهان(cache)، تا افزودن توابع و کلاس‌های view «عمومی» (که مقدار کدی را که توسعه‌دهندگان باید برای آن بنویسند کاهش می‌دهد).

 

جنگو اکنون یک پروژه منبع باز مشارکتی و پر رونق است که هزاران کاربر و مشارکت کننده دارد. جنگو در حالی که هنوز دارای برخی از ویژگی‌هایی است که منشا آن را نشان می‌دهد، به یک چارچوب همه کاره تبدیل شده است که قادر به توسعه هر نوع وب‌سایتی است.

 

دوره پیشنهادی: دوره آموزش پایتون (python)

 

 #  جنگو چقدر محبوب است؟

هیچ اندازه گیری آسان و قطعی برای محبوبیت چارچوب های سمت سرور وجود ندارد (اگرچه می توانید محبوبیت را با استفاده از مکانیسم هایی مانند شمارش تعداد پروژه های GitHub و سؤالات StackOverflow برای هر پلتفرم تخمین بزنید). سوال بهتر این است که آیا جنگو به اندازه کافی محبوب است تا از مشکلات پلتفرم های نامحبوب جلوگیری کند؟ آیا به تکامل خود ادامه می دهد؟ در صورت نیاز می توانید کمک بگیرید؟ آیا اگر جنگو را یاد بگیرید فرصتی برای شما وجود دارد که کار حقوقی دریافت کنید؟

 

بر اساس تعداد سایت‌های پرمخاطب که از جنگو استفاده می‌کنند، تعداد افرادی که در پایگاه کد مشارکت می‌کنند، و تعداد افرادی که هم رایگان و هم پولی برای پشتیبانی ارائه می‌کنند، بله، جنگو یک چارچوب محبوب است!

 

سایت‌های پرمخاطب که از جنگو استفاده می‌کنند عبارتند از: Disqus، Instagram، Knight Foundation، MacArthur Foundation، Mozilla، National Geographic، Open Knowledge Foundation، Pinterest و Open Stack.

 

مقاله پیشنهادی: بازبینی فریمورک جنگو - مزایا و معایب

 

 #  آیا جنگو نظری(opinionated) است؟

فریمورک های وب اغلب خود را به عنوان "نظری" یا "بدون نظر" می نامند.

 

چارچوب های نظری، آنهایی هستند که در مورد "راه درست" برای انجام هر کار خاص نظر دارند. آنها اغلب از توسعه سریع در یک حوزه خاص (حل مشکلات یک نوع خاص) پشتیبانی می کنند زیرا روش صحیح انجام هر کاری معمولاً به خوبی درک شده و به خوبی مستند شده است. با این حال، آنها می توانند در حل مسائل خارج از حوزه اصلی خود انعطاف کمتری داشته باشند، و تمایل دارند انتخاب های کمتری برای اجزا و رویکردهایی که می توانند استفاده کنند ارائه دهند.

 

در مقابل، چارچوب‌های بدون نظر محدودیت‌های بسیار کمتری در مورد بهترین راه برای چسباندن اجزا به یکدیگر برای رسیدن به یک هدف یا حتی اجزایی که باید استفاده شوند، دارند. آن‌ها استفاده از مناسب‌ترین ابزارها را برای توسعه‌دهندگان برای تکمیل یک کار خاص آسان‌تر می‌کنند، البته با هزینه‌ای که باید خودتان آن اجزا را پیدا کنید.

 

جنگو "تا حدودی نظری است" و از این رو "بهترین های هر دو جهان" را ارائه می دهد. مجموعه ای از مؤلفه ها را برای انجام بیشتر وظایف توسعه وب و یک (یا دو) روش ترجیحی برای استفاده از آنها فراهم می کند. با این حال، معماری جداشده جنگو به این معنی است که معمولاً می‌توانید از بین تعدادی گزینه مختلف انتخاب کنید یا در صورت تمایل، از گزینه‌های کاملاً جدید پشتیبانی کنید.

 

ویدیو پیشنهادی: ویدیو آموزش متد setup در جنگو

 

 #  کد جنگو چه شکلی است؟

در یک وب‌سایت سنتی مبتنی بر داده، یک برنامه وب منتظر درخواست‌های HTTP از مرورگر وب (یا سایر کلاینت‌ها) است. هنگامی که درخواستی دریافت می‌شود، برنامه بر اساس URL و احتمالاً اطلاعات موجود در داده‌های POST یا داده‌های GET، موارد مورد نیاز را بررسی می‌کند. بسته به آنچه مورد نیاز است، ممکن است اطلاعات را از یک پایگاه داده بخواند یا بنویسد یا سایر وظایف مورد نیاز برای برآورده کردن درخواست را انجام دهد. سپس برنامه پاسخی را به مرورگر وب برمی‌گرداند، و اغلب به صورت پویا یک صفحه HTML برای مرورگر ایجاد می‌کند تا با قرار دادن داده‌های بازیابی شده در محل‌هایی در قالب HTML نمایش داده شود.

 

برنامه های وب جنگو معمولا کدهایی را که هر یک از این مراحل را انجام می دهد در فایل های جداگانه گروه بندی می کنند:

 

معماری پروژه‌های جنگو

 

 

  • URLs: در حالی که پردازش درخواست‌ها از هر URL منفرد از طریق یک تابع امکان‌پذیر است، نوشتن یک تابع view جداگانه برای مدیریت هر منبع بسیار قابل نگهداری است. یک نشانگر URL برای هدایت درخواست های HTTP به view مناسب بر اساس URL درخواست استفاده می شود. نشانگر URL همچنین می‌تواند الگوهای خاصی از رشته‌ها یا ارقام را که در URL ظاهر می‌شوند مطابقت دهد و آنها را به عنوان داده به یک تابع view ارسال کند.

 

  • View: یک View تابع کنترل کننده درخواست است که درخواست های HTTP را دریافت می کند و پاسخ های HTTP را برمی گرداند. viewها به داده‌های مورد نیاز برای برآورده کردن درخواست‌ها از طریق مدل‌ها دسترسی دارند و قالب‌بندی پاسخ را به الگوها واگذار می‌کنند.

 

  • Models: مدل‌ها اشیاء پایتون هستند که ساختار داده‌های یک برنامه کاربردی را تعریف می‌کنند و مکانیسم‌هایی را برای مدیریت (افزودن، تغییر، حذف) و پرس و جو رکوردها در پایگاه داده ارائه می‌کنند.

 

  • Templates: یک template فایل متنی است که ساختار یا طرح بندی یک فایل (مانند صفحه HTML) را با متغیرهایی که برای نمایش محتوای واقعی استفاده می شود، تعریف می کند. یک view می تواند به صورت پویا یک صفحه HTML با استفاده از یک الگوی HTML ایجاد کند و آن را با داده های یک مدل پر کند. یک template می تواند برای تعریف ساختار هر نوع فایلی استفاده شود. لازم نیست HTML باشد!

 

 

بخش‌های زیر به شما ایده‌ای درباره شکل ظاهری این بخش‌های اصلی برنامه جنگو می‌دهد.

 

ویدیو پیشنهادی: ویدیو آموزش تفاوت AbstractUser با AbstractBaseUser در جنگو

 

 +  ارسال درخواست به view مناسب(urls.py)

یک ارسال کننده URL  معمولاً در فایلی به نام urls.py ذخیره می شود. در مثال زیر، ارسال کننده (urlpatterns) فهرستی از مسیرها (الگوهای URL خاص) و توابع viewی مربوطه را تعریف می‌کند. اگر یک درخواست HTTP دریافت شود که دارای URL منطبق با الگوی مشخص شده باشد، تابع view مربوطه فراخوانی می شود و درخواست ارسال می شود.

urlpatterns = [
    path('admin/', admin.site.urls),
    path('book/<int:id>/', views.book_detail, name='book_detail'),
    path('catalog/', include('catalog.urls')),
    re_path(r'^([0-9]+)/$', views.best),
]

 

شی urlpatterns لیستی از توابع path() و/یا re_path() است (لیست های پایتون با استفاده از براکت تعریف می شوند، جایی که آیتم ها با کاما از هم جدا می شوند و ممکن است یک کامای انتهایی اختیاری داشته باشند. به عنوان مثال: [item1, item2, item3, ]).

 

اولین آرگومان برای هر دو متد یک مسیر (الگو) است که مطابقت خواهد داشت. متد path() از پرانتز برای تعریف بخش‌هایی از URL استفاده می‌کند که به عنوان آرگومان‌های نام‌گذاری شده گرفته می‌شوند و به تابع view ارسال می‌شوند. تابع ()re_path از یک رویکرد تطبیق الگوی منعطف استفاده می کند که به عنوان عبارت منظم شناخته می شود.

 

آرگومان دوم تابع دیگری است که با تطبیق الگو فراخوانی می شود. علامت views.book_detail نشان می دهد که تابع ()book_detail نامیده می شود و می توان آن را در ماژولی به نام views (به عنوان مثال در داخل فایلی به نام views.py) پیدا کرد.

 

ویدیو پیشنهادی: ویدیو آموزش aggregation در جنگو

 

 +  مدیریت درخواست(views.py)

viewها قلب برنامه وب هستند، درخواست‌های HTTP را از مشتریان وب دریافت می‌کنند و پاسخ‌های HTTP را برمی‌گردانند. در این بین، آنها منابع دیگر فریم ورک را برای دسترسی به پایگاه داده ها، رندر قالب ها و غیره به کار می گیرند.

 

در مثال زیر index یک تابع ار فایل views را نشان می‌دهد که می‌توانست توسط URL mapper ما در بخش قبل فراخوانی شود. مانند همه توابع view، یک شی HttpRequest را به عنوان پارامتر (درخواست) دریافت می کند و یک شی HttpResponse را برمی گرداند. در این حالت ما هیچ کاری با درخواست انجام نمی دهیم و پاسخ ما یک رشته را برمی گرداند.

# filename: views.py (Django view functions)

from django.http import HttpResponse

def index(request):
    # Get an HttpRequest - the request parameter
    # perform operations using information from the request.
    # Return HttpResponse
    return HttpResponse('Hello from Django!')

 

viewها معمولاً در فایلی به نام views.py ذخیره می شوند.

 

ویدیو پیشنهادی: ویدیو آموزش middleware در جنگو

 

 +  مشخص کردن دیتا مدل‌ها(models.py)

برنامه های تحت وب جنگو، داده ها را از طریق اشیاء پایتون که model نامیده می شوند، مدیریت و پرس و جو می کنند. مدل‌ها ساختار داده‌های ذخیره‌شده را تعریف می‌کنند، از جمله انواع فیلدها و احتمالاً حداکثر اندازه آنها، مقادیر پیش‌فرض، گزینه‌های فهرست انتخاب، متن راهنما برای اسناد، متن برچسب برای فرم‌ها، و غیره. تعریف مدل مستقل از پایگاه داده زیربنایی است. شما می توانید یکی از چندین مورد را به عنوان بخشی از تنظیمات پروژه خود انتخاب کنید. هنگامی که انتخاب کردید از چه پایگاه داده ای می خواهید استفاده کنید، اصلاً نیازی به صحبت مستقیم با آن ندارید - فقط ساختار مدل و سایر کدهای خود را بنویسید، و جنگو تمام "کار کثیف" برقراری ارتباط با پایگاه داده را انجام می دهد.

 

قطعه کد زیر یک مدل جنگو بسیار ساده برای یک شی Team را نشان می دهد. کلاس Team از کلاس models.Model جنگو مشتق شده است. team_name و team_level را به عنوان فیلدهای کاراکتر تعریف می کند و حداکثر تعداد کاراکترهایی را که برای هر رکورد ذخیره می شود، مشخص می کند. team_level می تواند یکی از چندین مقدار باشد، بنابراین ما آن را به عنوان یک فیلد انتخابی تعریف می کنیم و نقشه ای بین گزینه های نمایش داده شده و داده های ذخیره شده به همراه یک مقدار پیش فرض ارائه می دهیم.

# filename: models.py

from django.db import models

class Team(models.Model):
    team_name = models.CharField(max_length=40)

    TEAM_LEVELS = (
        ('U09', 'Under 09s'),
        ('U10', 'Under 10s'),
        ('U11', 'Under 11s'),
        ...  #list other team levels
    )
    team_level = models.CharField(max_length=3, choices=TEAM_LEVELS, default='U11')

 

ویدیو پیشنهادی: ویدیو آموزش جستجو با استفاده از آبجکت Q در جنگو

 

 +  کوئری داخل مدل‌ها(views.py)

مدل جنگو یک API پرس و جو ساده برای جستجوی پایگاه داده مرتبط ارائه می دهد. این می تواند با تعدادی از فیلدها در یک زمان با استفاده از معیارهای مختلف مطابقت داشته باشد (مثلاً دقیق، حساس به حروف بزرگ، بزرگتر از، و غیره)، و می تواند از عبارات پیچیده پشتیبانی کند (به عنوان مثال، می توانید جستجویی را در تیم های زیر 11 سال که یک تیم دارند مشخص کنید. نامی که با "Fr" شروع یا با "al" ختم می شود).

 

قطعه کد یک تابع مشاهده (کنترل کننده منابع) را برای نمایش همه تیم های U09 ما نشان می دهد. خط list_teams = Team.objects.filter(team_level__exact="U09") نشان می دهد که چگونه می توانیم از API query مدل برای فیلتر کردن همه رکوردهایی استفاده کنیم که فیلد team_level دقیقاً متن 'U09' دارد (توجه داشته باشید که چگونه این معیار به filter() به‌عنوان آرگومان عمل می‌کند، با نام فیلد و نوع تطبیق که با یک زیرخط دوگانه از هم جدا شده‌اند: team_level__exact).

## filename: views.py

from django.shortcuts import render
from .models import Team

def index(request):
    list_teams = Team.objects.filter(team_level__exact="U09")
    context = {'youngest_teams': list_teams}
    return render(request, '/best/index.html', context)

 

این تابع از تابع render() برای ایجاد HttpResponse استفاده می کند که به مرورگر ارسال می شود. این تابع یک میانبر است. یک فایل HTML با ترکیب یک الگوی HTML مشخص و برخی داده ها برای درج در قالب ایجاد می کند (در متغیری به نام "context" ارائه شده است). در بخش بعدی نشان می‌دهیم که چگونه الگو داده‌ها را برای ایجاد HTML در آن قرار داده است.

 

 

 +  نمایش داده‌ها(HTML Templates)

سیستم‌های Template به شما امکان می‌دهند ساختار یک سند خروجی را با استفاده از placeholder برای داده‌هایی که هنگام تولید صفحه پر می‌شوند، مشخص کنید. templateها اغلب برای ایجاد HTML استفاده می شوند، اما می توانند انواع دیگری از سند را نیز ایجاد کنند. جنگو هم از سیستم template بومی خود و هم از یک کتابخانه محبوب پایتون به نام Jinja2 خارج از جعبه پشتیبانی می کند (همچنین می توان آن را برای پشتیبانی از سیستم های دیگر در صورت نیاز ساخت).

 

قطعه کد نشان می دهد که قالب HTML فراخوانی شده توسط تابع render() در بخش قبل ممکن است شبیه باشد. این الگو با این فرض نوشته شده است که وقتی رندر می شود به متغیر لیستی به نام Youngest_teams دسترسی خواهد داشت (این در متغیر متنی داخل تابع render() بالا موجود است). در داخل اسکلت HTML یک عبارت داریم که ابتدا بررسی می‌کند که آیا متغیر youngest_teams وجود دارد یا خیر، و سپس آن را در یک حلقه for تکرار می‌کند. در هر تکرار، الگو مقدار تیم_نام هر تیم را در عنصر <li> نشان می‌دهد.

## filename: best/templates/best/index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Home page</title>
</head>
<body>
  {% if youngest_teams %}
    <ul>
      {% for team in youngest_teams %}
        <li>{{ team.team_name }}</li>
      {% endfor %}
    </ul>
  {% else %}
    <p>No teams are available.</p>
  {% endif %}
</body>
</html>

 

ویدیو پیشنهادی: ویدیو آموزش عبارات F در جنگو

 

 #  با جنگو دیگر چه کارهایی میتوانید انجام دهید؟

بخش‌های قبلی ویژگی‌های اصلی را نشان می‌دهد که تقریباً در هر برنامه وب استفاده می‌کنید: نقشه‌برداری URL، توابع view، مدل‌ها و templateها. فقط چند مورد دیگر ارائه شده توسط جنگو عبارتند از:

 

  • Forms: فرم های HTML برای جمع آوری داده های کاربر برای پردازش در سرور استفاده می شود. جنگو ایجاد فرم، اعتبار سنجی و پردازش را ساده می کند.
  • User authentication and permissions: جنگو شامل یک سیستم احراز هویت و مجوز کاربر قوی است که با در نظر گرفتن امنیت ساخته شده است.
  • Caching: ایجاد محتوا به صورت پویا از نظر محاسباتی بسیار فشرده تر (و کندتر) از ارائه محتوای ثابت است. جنگو کش انعطاف پذیری را فراهم می کند تا بتوانید تمام یا بخشی از یک صفحه رندر شده را ذخیره کنید تا به جز در مواقع ضروری دوباره رندر نشود.
  • Administration site: هنگامی که برنامه ای را با استفاده از اسکلت اولیه ایجاد می کنید، مدیریت جنگو به طور پیش فرض شامل می شود. ارائه یک صفحه مدیریت برای مدیران سایت برای ایجاد، ویرایش و مشاهده هر مدل داده در سایت شما بسیار ساده است.
  • Serialising data: جنگو سریال سازی و ارائه داده های شما را به صورت XML یا JSON آسان می کند. این می تواند هنگام ایجاد یک وب سرویس (وب سایتی که صرفاً داده هایی را برای مصرف سایر برنامه ها یا سایت ها ارائه می دهد و خود چیزی نمایش نمی دهد) مفید باشد، یا هنگام ایجاد وب سایتی که در آن کد سمت کلاینت تمام رندرها را مدیریت می کند. از داده ها

 

 

 #  نتیجه گیری

تبریک می‌گوییم، شما اولین قدم را در سفر جنگو خود به پایان رساندید! اکنون باید مزایای اصلی جنگو، کمی در مورد تاریخچه آن، و تقریباً ظاهر هر یک از بخش های اصلی یک برنامه جنگو را درک کنید. شما همچنین باید چند چیز در مورد زبان برنامه نویسی پایتون یاد گرفته باشید، از جمله نحو لیست ها، توابع و کلاس ها.

مطالب مشابه



مونگارد