در دنیای جنگو، یک ضربالمثل معروف وجود دارد: «پروژه بساز، اما با اپلیکیشنها زندگی کن!» اگر درس قبل را به ساختن زمین و فونداسیون یک ساختمان تشبیه کنیم، ساخت اپ در جنگو دقیقاً همان مرحلهای است که اتاقها، آشپزخانه و بخشهای کاربردی ساختمان را طراحی میکنید. در این درس، ما قرار است اولین بخش واقعی از پروژه JobTrack را با نام jobs را ایجاد کنیم.
چرا جنگو ما را مجبور به ساخت App میکند؟
بسیاری از تازهکارها میپرسند: «چرا نمیتوانیم همهی کدها را همانجای اول بنویسیم؟» پاسخ در یک کلمه است: نظم.
تصور کنید بخواهید بخش «مدیریت آگهیها»، «پنل کاربری» و «سیستم پرداخت» را همگی در یک پوشه شلوغ رها کنید؛ نتیجه چیزی جز یک کلاف سردرگم نخواهد بود.
مفهوم Django Apps به شما این قدرت را میدهد که پروژهتان را به قطعات کوچک، مستقل و قابلفهم تقسیم کنید. این یعنی اگر روزی بخواهید بخش آگهیها را در پروژه دیگری هم استفاده کنید، به سادگی میتوانید آن پوشه را کپی و منتقل کنید.
در این درس چه چیزی را تجربه میکنید؟
ما در این واحد درسی، نه تنها با دستور startapp آشنا میشویم، بلکه یاد میگیریم چطور این نوزاد تازهمتولدشده را به «لیست اپلیکیشنهای نصب شده» در فایل تنظیمات معرفی کنیم.
مباحثی که قرار است با هم جلو ببریم عبارتند از:
- تفاوت کلیدی و ساختاری بین Project و App.
- اجرای دستور ساخت اولین اپلیکیشن برای سامانه رهگیری استخدام.
- آموزش ثبت اپلیکیشن در بخش INSTALLED_APPS (جایی که اکثر ارورهای مبتدیها از آنجا شروع میشود!).
- بررسی فایلهای داخلی اپلیکیشن مثل models.py و views.py که مغز متفکر برنامه ما هستند.
هدف نهایی: ایجاد بخش مدیریت آگهیها
ما نام این اپلیکیشن را jobs میگذاریم. این بخش قرار است مسئول تمام عملیاتهای مربوط به ثبت، ویرایش و نمایش آگهیهای استخدامی باشد. با پایان این درس، شما دیگر فقط یک اسکلت خالی ندارید؛ بلکه اولین واحد عملیاتی پروژهتان را آماده کردهاید تا در درسهای بعدی به آن جان ببخشیم.
تفاوت Project و App: معماری ماژولار جنگو به زبان ساده
یکی از بزرگترین سوالاتی که در ابتدای مسیر آموزش جنگو ذهن دانشجو را درگیر میکند، این است که «چرا وقتی یک بار پروژه را ساختیم، حالا باید دوباره چیزی به نام اپلیکیشن بسازیم؟» درک این تفاوت، کلید اصلی ورود به دنیای حرفهای توسعه وب با پایتون است.
پروژه (Project): ظرف بزرگی که همهچیز را در خود دارد
پروژه در واقع همان کلِ وبسایت شماست. وقتی ما job_hunter را ساختیم، در حقیقت یک ظرف بزرگ ایجاد کردیم که شامل تنظیمات کلی، پیکربندی دیتابیس و مدیریت آدرسهای اصلی سایت است.
پروژه خودش به تنهایی کاری انجام نمیدهد؛ بلکه مثل یک مدیر ارشد، فقط وظیفه هماهنگی بین بخشهای مختلف را بر عهده دارد. شما در هر وبسایت، فقط و فقط یک پروژه دارید.
اپلیکیشن (App): چاقوهای سوئیسی کوچک و متخصص
اما Django Apps چیست؟ اپلیکیشنها واحدهای کوچک و مستقلی هستند که هر کدام یک وظیفه خاص و مشخص را انجام میدهند.
در پروژه سامانه استخدامی ما:
- یک اپلیکیشن مسئول مدیریت «آگهیهای شغلی» است (که نامش را jobs میگذاریم).
- یک اپلیکیشن دیگر میتواند مسئول «پنل کاربری و رزومهها» باشد.
- اپلیکیشن دیگری ممکن است فقط «نظرات و گفتگوها» را مدیریت کند.
چرا این تفکیک برای سئو و توسعه حیاتی است؟
اینکه جنگو اصرار دارد از ساختار ماژولار استفاده کنید، یک هدیه بزرگ به برنامهنویس است. تصور کنید در پروژه بعدیتان هم نیاز به بخش «نظرات» داشته باشید. اگر این بخش را به صورت یک اپلیکیشن جداگانه در پروژه فعلی ساخته باشید، کافی است پوشه آن را کپی کرده و در پروژه جدید قرار دهید. به همین سادگی!
در واقع، جنگو با این معماری به شما میگوید: «کدی بنویس که یک بار وقتت را بگیرد، اما هزار بار به کارت بیاید.»
تفاوت در یک نگاه
اگر بخواهیم این مفهوم را در ذهنمان نهایی کنیم، این مقایسه بهترین راه است:
- پروژه (Project): مثل یک گوشی موبایل است که تنظیمات اصلی و باتری را مدیریت میکند.
- اپلیکیشن (App): مثل برنامههای نصب شده روی گوشی (اینستاگرام، تلگرام و...) هستند که هر کدام قابلیت خاصی را به گوشی اضافه میکنند.
یک نکته کلیدی:
شرکتهای بزرگ همیشه به دنبال برنامهنویسانی هستند که کد "تمیز" و "ماژولار" مینویسند. یاد گرفتن نحوه صحیح ساخت اپ در جنگو اولین قدم شما برای نشان دادن این حرفهایگری است. شما با این کار ثابت میکنید که معماری پروژههای بزرگ را درک کردهاید و کدهایتان را به صورت درهمریخته و غیرقابلفهم رها نمیکنید.
اجرای دستور startapp: ساخت اولین واحد پروژه JobTrack
وقت آن است که تئوری را کنار بگذاریم و اولین بخش عملیاتی پروژه JobTrack را خلق کنیم. ما میخواهیم بخشی بسازیم که وظیفهاش مدیریت آگهیهای شغلی است. برای این کار، از دستور اختصاصی جنگو برای ایجاد برنامههای کوچک یا همان Django Apps استفاده میکنیم.
قدم اول: فراخوانی دستور startapp
ابتدا مطمئن شوید که در ترمینال، داخل پوشه اصلی پروژه (همانجایی که فایل manage.py قرار دارد) هستید. محیط مجازیتان هم باید فعال باشد. حالا دستور زیر را با دقت وارد کنید:
python manage.py startapp jobs
با زدن کلید اینتر، در ظاهر اتفاق خاصی نمیافتد و هیچ پیام تبریکی دریافت نمیکنید! اما اگر به پوشه پروژه نگاه کنید، متوجه میشوید که یک پوشه جدید به نام jobs ساخته شده است. این پوشه، همان قلب تپنده بخش استخدام سایت شماست.
چرا این بار از نقطه (.) استفاده نکردیم؟
شاید یادتان باشد که موقع ساخت پروژه جدید در جنگو، در انتهای دستور یک نقطه گذاشتیم. اما در مورد دستور startapp، ما هرگز این کار را نمیکنیم.
دلیلش ساده است: ما میخواهیم جنگو یک محفظه یا پوشه کاملاً مجزا برای این بخش بسازد تا کدهای مربوط به آگهیها از تنظیمات اصلی سایت جدا بماند. این جداسازی، همان قدرت معماری جنگو است که به شما اجازه میدهد پروژهای منظم و حرفهای داشته باشید.
داخل پوشه jobs چه خبر است؟
جنگو به صورت خودکار چند فایل پایه برای شما ردیف کرده است که هر کدام وظیفهای دارند:
- models.py: اینجا مشخص میکنیم که یک آگهی شغلی چه ویژگیهایی دارد (مثلاً عنوان شغل، حقوق، نام شرکت).
- views.py: منطق نمایش را اینجا مینویسیم؛ مثلاً اینکه وقتی کاربر روی یک آگهی کلیک کرد، چه اطلاعاتی به او نشان داده شود.
- admin.py: ابزاری برای معرفی این بخش به پنل مدیریت قدرتمند جنگو.
نکته برای نامگذاری:
همیشه سعی کنید نام اپلیکیشنهای خود را کوتاه، معنادار و به صورت جمع انتخاب کنید. ما اسم این بخش را jobs گذاشتیم چون قرار است مجموعهای از آگهیهای شغلی را مدیریت کند. این کار باعث میشود بعدها که تعداد بخشهای سایت زیاد شد، با یک نگاه بفهمید هر پوشه چه کاری انجام میدهد.
معرفی اپلیکیشن به پروژه: تنظیمات INSTALLED_APPS
ساختن پوشهی اپلیکیشن تنها نیمی از راه است. جنگو به صورت خودکار پوشههای جدید را اسکن نمیکند؛ بنابراین اگر همین حالا کدی در اپلیکیشن jobs بنویسید، پروژه آن را نادیده میگیرد. برای اینکه به جنگو بفهمانید این بخش جدید بخشی از پیکرهی سایت شماست، باید سراغ تنظیمات INSTALLED_APPS بروید.
ثبت شناسنامه اپلیکیشن در فایل تنظیمات
فایل settings.py را در پوشه اصلی پروژه باز کنید. کمی که پایین بروید، لیستی به نام INSTALLED_APPS را میبینید. در این لیست، نام چند اپلیکیشن پیشفرض خودِ جنگو (مثل بخش ادمین و احراز هویت) وجود دارد. شما باید نام اپلیکیشن خودتان را به این لیست اضافه کنید.
کافی است نام 'jobs' را به انتهای این لیست اضافه کنید. دقت کنید که بعد از نام اپ، حتماً علامت کاما (,) را بگذارید تا ساختار پایتونی لیست به هم نریزد:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
# ... سایر اپلیکیشنها
'jobs',
]
چرا این مرحله برای جنگو حیاتی است؟
تا زمانی که ثبت اپلیکیشن در تنظیمات جنگو را انجام ندهید، دو اتفاق مهم نمیافتد:
- جنگو فایل models.py شما را برای ساخت جداول دیتابیس بررسی نمیکند.
- فایلهای قالب (Templates) و پوشههای استاتیک مربوط به این اپلیکیشن توسط پروژه شناسایی نمیشوند.
در واقع، این لیست به جنگو میگوید: «هنگام بالا آمدن سرور، حتماً محتویات پوشه jobs را هم بارگذاری کن.»
کالبدشکافی ساختار یک اپلیکیشن: درون پوشه App چه خبر است؟
وقتی دستور startapp را اجرا کردید، جنگو یک بسته آماده از فایلهای پایتونی را در پوشه jobs برایتان چید. هر کدام از این فایلها وظیفهی خاصی دارند و قرار نیست شما در یک فایل واحد، هزاران خط کد بنویسید. این جداسازی همان چیزی است که به آن ساختار فایلهای اپ جنگو میگوییم و باعث میشود حتی پروژههای عظیم هم منظم باقی بمانند.
فایلهای اصلی موجود در یک App
بیایید نگاهی به درون این پوشه بیندازیم و ببینیم هر فایل قرار است چه باری از دوش پروژه JobTrack بردارد:
models.py (محل ذخیره دادهها): این مهمترین فایل برای شروع کار است. اینجا مشخص میکنید که یک "آگهی استخدام" چه فیلدهایی دارد؛ مثلاً نام شرکت، عنوان شغلی و میزان حقوق. در واقع دیتابیس شما از روی کدهایی که اینجا مینویسید ساخته میشود.
views.py (مغز متفکر): درخواست کاربر به این فایل میرسد. ویوها تصمیم میگیرند که چه اطلاعاتی از دیتابیس استخراج شود و در نهایت چه صفحهای به کاربر نمایش داده شود.
admin.py (مدیریت آسان): جنگو یک پنل مدیریت آماده دارد. با تنظیمات این فایل، شما به جنگو میگویید که اجازه داشته باشید آگهیهای شغلی را از طریق آن پنل گرافیکی و بدون کدنویسی، اضافه یا ویرایش کنید.
apps.py: تنظیمات سیستمی مربوط به خودِ اپلیکیشن در این فایل قرار میگیرد. معمولاً به جز موارد خاص، نیازی نیست سراغ این فایل بروید.
tests.py: اینجا محلی است که کدهایی برای تست کردن برنامهتان مینویسید تا مطمئن شوید همه بخشها درست کار میکنند و با تغییرات جدید خراب نمیشوند.
پوشه migrations؛ حافظه تاریخی دیتابیس
داخل پوشه اپلیکیشن، یک پوشه دیگر به نام migrations میبینید. این پوشه حکم "ماشین زمان" دیتابیس شما را دارد. هر بار که تغییری در فایل models.py ایجاد میکنید، جنگو یک فایل جدید اینجا میسازد تا تاریخچهی تغییرات دیتابیس را ذخیره کند. این کار باعث میشود اگر اشتباهی کردید، بتوانید به نسخههای قبلی برگردید.
چرا این فایلها خالی هستند؟
اگر همین حالا این فایلها را باز کنید، میبینید که تقریباً فقط یک خط کد دارند (Import). جنگو این فایلها را مثل یک دفترچه سفید در اختیار شما گذاشته تا فقط کدهای مربوط به بخش "مشاغل" را در آن بنویسید.
این موضوع در توسعه وب با پایتون بسیار کلیدی است؛ چون کدهای شما با بخشهای دیگر سایت (مثل بخش کاربران) قاطی نمیشود.
شاید در ابتدا وجود این همه فایل گیجکننده به نظر برسد، اما بعد از ساختن دو یا سه اپلیکیشن، دستتان عادت میکند. یادتان باشد در جنگو، "هر چیز جای خودش را دارد".
اگر به دنبال منطق نمایش میگردید، مستقیم سراغ views بروید و اگر میخواهید چیزی در دیتابیس تغییر دهید، فقط با models کار دارید.
چرا باید برای هر بخش پروژه یک اپ جداگانه بسازیم؟ (Reusability)
بسیاری از برنامهنویسانی که تازه وارد دنیای توسعه وب با جنگو میشوند، وسوسه میشوند که همهی کدها را داخل یک اپلیکیشنِ شلوغ بریزند. اما حرفهایها دقیقاً برعکس عمل میکنند.
آنها پروژه را به تکههای کوچکی تقسیم میکنند که هر کدام مثل یک قطعه لگو، مستقل عمل میکند. این همان مفهوم قابلیت استفاده مجدد یا Reusability است که جنگو را در دنیا محبوب کرده است.
کدنویسی برای یک بار، استفاده برای همیشه
تصور کنید امروز اپلیکیشن jobs را برای سامانه رهگیری استخدام خود میسازید. شش ماه دیگر، مشتری جدیدی از شما یک سایت کاریابی تخصصی برای مهندسان میخواهد.
اگر بخش آگهیها را به صورت یک Django App مجزا و مستقل ساخته باشید، نیازی نیست دوباره چرخ را اختراع کنید! کافی است پوشه jobs را بردارید، در پروژه جدید کپی کنید و در لیست تنظیمات ثبتش کنید. به همین سادگی، بخش بزرگی از پروژه جدید شما در عرض چند ثانیه آماده میشود.
نظم ذهنی و خطایابی سریعتر
وقتی هر بخش از پروژه وظیفهی خاص خودش را داشته باشد، زندگی شما به عنوان برنامهنویس بسیار راحتتر میشود.
اگر مشکلی در ثبت آگهیها پیش بیاید، مستقیم به سراغ پوشه jobs میروید.
اگر سیستم ورود کاربران ایراد داشته باشد، میدانید که باید در اپلیکیشن accounts دنبال آن بگردید.
این تفکیک باعث میشود کدهای شما به هم گره نخورند (Low Coupling) و اگر تغییری در یک بخش ایجاد کردید، کل سایت ناگهان از کار نیفتد.
همکاری تیمی بدون دردسر
در پروژههای واقعی و بزرگ، معمولاً چندین برنامهنویس به صورت همزمان روی یک سایت کار میکنند. معماری ساخت اپ در جنگو به تیمها اجازه میدهد که هر شخص مسئول توسعه یک اپلیکیشن خاص باشد.
مثلاً یک نفر روی بخش «پرداخت آنلاین» کار میکند و نفر دیگر «سیستم ارسال تیکت» را میسازد. چون این دو بخش در دو اپلیکیشن جداگانه هستند، فایلهای آنها با هم تداخل پیدا نمیکند و مدیریت پروژه در گیتهاب یا سایر ابزارها به یک کابوس تبدیل نمیشود.
استانداردی که شما را متمایز میکند
برنامهنویسی که همه چیز را در یک پوشه جمع میکند، شاید در نگاه اول سریعتر کد بزند، اما در زمان توسعه و نگهداری پروژه شکست میخورد.
یادگیری ساختار ماژولار جنگو به شما دید وسیعی میدهد تا به جای یک "کدزن" ساده، به یک "معمار نرمافزار" تبدیل شوید. این دقیقاً همان چیزی است که شرکتهای معتبر در رزومه شما به دنبالش هستند: توانایی نوشتن کدی که تمیز، منظم و قابل انتقال باشد.