loading

بروزرسانی

جنگو چیست و مقدمه ای بر ویژگی ها، ساختار و رفتار آن

عمومی
2022 فوریه 01

جنگو (Django) چیه؟

جنگو یک وب فریمورک سطح بالای زبان پایتونه که به ما توانایی توسعه سریع (rapid development) و ایجاد برنامه‌ های قابل نگهداری (maintainable) رو میده.

این فریمورک توسط توسعه دهنده های با تجربه ساخته شده و بسیاری از مشکلات و مسائل توسعه وب رو کنترل میکنه، بنابراین شما نیازی به انجام بسیاری از کارهای تکراری ندارین.

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

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

کامل بودن

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

تطبیق پذیری

جنگو تقریبا برای ساخت هر نوع وب سایتی استفاده می‌شه، از سیستم های مدیریت محتوا گرفته تا شبکه های اجتماعی. جنگو می‌تونه با هر فریمورک سمت کاربری به خوبی کار کنه و داده ها رو در قالب های مختلفی مانند HTML، XML و JSON برگردونه. جنگو برای هر کاری که بخواید انجام بدید راه حلی داره اما به شما این اجازه رو میده تا در صورت نیاز، امکانات اون رو توسعه بدید.

امنیت

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

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

از جمله دیگر مشکلات امنیتی که توسط جنگو کنترل می‌شن می‌تونیم از SQL injection، cross-site scripting و cross-site request forgery نام ببریم.

مقیاس پذیری

جنگو از یک معماری مبتنی بر جزء به نام shared-nothing استفاده میکنه. به این معنی که هر بخش از معماری از بخش دیگه مستقله و می‌تونه تغییر کنه یا جایگزین بشه. این معماری باعث میشه تا بتونیم با افزایش ترافیک روی یک بخش (سرور های دیتابیس، caching و اپلیکیشن)، با افزودن سخت افزار، اون قسمت رو scale کنیم. به طور مثال اینستاگرام که یکی از پر ترافیک ترین اپلیکیشن های جهانه، تونسته جنگو رو مطابق با نیاز های خودش scale کنه.

قابل نگهداری

جنگو با توجه به اصول طراحی و الگوهایی ایجاد شده که تشویق به خلق کد های قابل نگهداری و با قابلیت استفاده دوباره میکنه. همچنین این فریمورک از اصل DRY یا همان Don’t repeat yourself استفاده میکنه، بنابراین هیچ تکرار غیر ضروری درون کد اون وجود نداره و مقدار کد رو کاهش میده. جنگو همچنین ما رو به این تشویق می‌کنه که قابلیت های مشابه را درون گروه هایی به نام application قرار بدیم.

قابل حمل

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

جنگو چقدر محبوبه؟

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

سایت های بسیاری مثل Instagram، Pinterest، Mozilla و Open stack از این فریمورک استفاده می‌کنند.

جنگو چجوری کار میکنه؟

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

یک اپلیکیشن جنگو کد های مربوط به موارد ذکر شده رو درون فایل های جداگانه نگه میداره:

نمودار جریان کنترل درخواست در جنگو
                                               جریان کنترل درخواست در جنگو

URLs

با وجود این که میشه تمام درخواست ها از تمام URL ها را درون فقط یک view function هندل کرد، بهتره به ازای هر URL یک view function داشته باشیم تا به کدی قابل نگهداری تر برسیم.

هنگامی که یک درخواست HTTP به اپلیکیشن جنگو میرسه، یک URL mapper که درون فایل urls.py تعریف شده، که همون urlpatterns، تصمیم میگیره که درخواست به کدام view ارسال بشه. اگر درون URL الگو هایی از رشته ها یا ارقام نیز داشته باشیم، این مقادیر به عنوان پارامتر به تابع مورد نظر ارسال میشن که کار رو بسیار راحت میکنه.

Views

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

Models

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

Templates

فایلی متنیه که قالب کلی یک فایل رو مشخص میکنه (مثل HTML یا هر چیز دیگه). درون این فایل، placeholder هایی وجود دارن که نشون میدن چه متغیر هایی باید در چه مکان هایی جایگزین بشن. تابع view میتونه داده های مورد نظر رو به این فایل ارسال و اون رو render کنه و در نهایت در قالب یک پاسخ HTTP به کلاینت برگردونه.

ساخت API با جنگو

اگر به توسعه ی اپلیکیشن های سمت سرور علاقه دارین، غیر ممکنه که نام Django REST framework رو نشنیده باشید.

Django REST framework یک فریمورکه برای ساخت API  که بر پایه ی جنگو نوشته شده  و به موازات اون کار میکنه. شما می‌تونید اون رو به سادگی و با استفاده از pip نصب کنید و تنظیمات اون رو در جنگو انجام بدید و توسعه ی API خودتون رو آغاز کنید.

اگرچه جنگو به شما این اجازه رو میده که حتی بدون Django REST framework به توسعه ی API بپردازید، اما استفاده از این فریمورک کار شما رو بسیار راحت تر و سریع تر میکنه. تمام اون چیزی که شما برای ساخت API به اون نیاز دارین، مثل GenericViews، ViewSets، Serializers، Routers و… از قبل داخل این فریمورک قرار گرفته . همچنین کتابخانه های بسیار دیگری بر پایه ی این فریمورک نوشته شدن که کار رو ساده تر میکنه.

توضیح بیشتر این فریمورک در این مقاله نمی‌گنجه و در مقاله ای جداگانه به اون پرداخته میشه.