
اولین پروژهای که با جنگو میسازید یک اپلیکیشن وبلاگ خواهد بود. این پروژه یک مقدمهی خوب برای آشنایی با قابلیتها و امکانات جنگو فراهم میکند.
وبلاگنویسی نقطهی شروع بسیار مناسبی برای ساخت یک پروژهی کامل با جنگو است، چون طیف گستردهای از قابلیتها را در بر میگیرد؛ از مدیریت سادهی محتوا گرفته تا امکانات پیشرفتهتری مثل کامنتگذاری، اشتراکگذاری پستها، جستجو و پیشنهاد پستهای مرتبط به کاربران.
پروژهی وبلاگ در سه فصل اولِ این کتاب بررسی میشود.
در فصل فعلی اقدامات زیر را انجام خواهیم داد:
ابتدا یک پروژه جنگو ایجاد میکنیم و یک اپلیکیشن برای وبلاگ میسازیم.
سپس مدلهای داده (Data Models) را تعریف کرده و آنها را با پایگاه داده هماهنگ میکنیم.
در نهایت Viewها، Templateها و URLها را میسازیم و همچنین یک پنل مدیریت برای مدیریت محتوای وبلاگ ایجاد میکنیم.
شکل زیر نمای کلی اپلیکیشن وبلاگی که قرار است بسازید را نشان میدهد:

اپلیکیشن وبلاگ شامل یک صفحه لیست تمامی پستها خواهد بود که در آن اطلاعاتی مانند عنوان پست، تاریخ انتشار، نویسنده، خلاصهای از متن پست (excerpt) و یک لینک برای خواندن کامل پست نمایش داده میشود. صفحهی لیست پستها با استفاده از view ای به نام post_list پیادهسازی خواهد شد. در این فصل یاد میگیرید که چگونه در جنگو یک View ایجاد کنید.
وقتی کاربران روی لینک یک پست در صفحهی لیست همه پستها کلیک کنند، به صفحهی نمایش جزئیات همان پست (detail view) هدایت میشوند. در این صفحه عنوان پست، تاریخ انتشار، نویسنده و متن کامل پست نمایش داده خواهد شد.
اکنون بیایید یک پروژهی جنگو برای وبلاگمان ایجاد کنیم. فریمورک جنگو دستوری فراهم کرده که با استفاده از آن میتوانید ساختار اولیهی فایلهای یک پروژه را بهصورت خودکار ایجاد کنید.
دستور زیر را در خط فرمان سیستم خود اجرا کنید:
django-admin startproject mysite
این دستور یک پروژه جنگو به نام mysite ایجاد میکند.
نکته: از نامگذاری پروژهها مشابه با نام ماژولهای داخلی پایتون یا جنگو خودداری کنید، زیرا ممکن است باعث تداخل و خطا شود.
بیایید نگاهی به ساختار پروژه ایجاد شده بیاندازیم
mysite/ manage.py mysite/ ــinitــ.py asgi.py settings.py urls.py wsgi.py
پوشهی بیرونی /mysite بهعنوان جعبه اصلی پروژه عمل میکند و شامل فایلهای زیر است:
manage.py: یک ابزار خط فرمان برای تعامل با پروژه است. معمولاً نیازی نیست این فایل را ویرایش کنید.
/mysite: این پوشه در واقع پکیج پایتون پروژه است و شامل فایلهای زیر میشود:
init___.py___: ک فایل خالی است که به پایتون میگوید پوشهی mysite باید بهعنوان یک ماژول پایتون در نظر گرفته شود.
asgi.py: تنظیمات لازم برای اجرای پروژه بهعنوان یک اپلیکیشن ASGI با وبسرورهایی که از ASGI پشتیبانی میکنند.
ASGI استاندارد جدید پایتون برای وبسرورهای asynchronous و اپلیکیشنهای وب محسوب میشود.
settings.py: شامل تنظیمات و پیکربندی پروژه است و تنظیمات پیشفرض اولیهی جنگو در آن قرار دارد.
urls.py: جایی است که الگوهای URL پروژه تعریف میشوند. هر URL در اینجا به یک view متصل (map) میشود.
wsgi.py: تنظیمات لازم برای اجرای پروژه بهعنوان یک اپلیکیشن WSGI با وبسرورهایی که از WSGI پشتیبانی میکنند.
اپلیکیشنهای جنگو برای ذخیرهی دادهها به پایگاه داده نیاز دارند. فایل settings.py شامل تنظیمات مربوط به پایگاه دادهی پروژه است که در متغیر DATABASES تعریف میشود.
تنظیمات پیشفرض جنگو استفاده از پایگاه داده SQLite3 است.
SQLite همراه با Python 3 ارائه میشود و میتوان از آن در هر برنامهی پایتونی استفاده کرد.
SQLite یک پایگاه دادهی سبک (lightweight) است که برای محیط توسعه (development) در پروژه های جنگو بسیار مناسب است.
اما اگر قصد دارید اپلیکیشن خود را در محیط نهایی محصول (production) منتشر کنید، بهتر است از یک پایگاه دادهی کاملتر مانند موارد زیر استفاده کنید:
PostgreSQL
MySQL
Oracle
اطلاعات بیشتر دربارهی راهاندازی پایگاه داده در جنگو را میتوانید در مستندات مربوطه پیدا کنید.
https://docs.djangoproject.com/en/5.0/topics/install/#database-installation
همچنین فایل settings.py شامل متغیری از جنس لیست به نام INSTALLED_APPS است که تعدادی از اپلیکیشنهای رایج جنگو را در بر دارد و بهصورت پیشفرض به پروژهی شما اضافه میشوند.
بعداً در بخش تنظیمات پروژه این اپلیکیشنها را بهطور کامل بررسی خواهیم کرد.
اپلیکیشنهای پیشفرض موجود در پروژه جنگو شامل مدلهای داده (Data Models) هستند که به جداول دیتابیس تطبیق داده میشوند.
شما مدلهای خودتان را در بخش "ایجاد مدل های وبلاگ" ایجاد خواهید کرد. اما برای کامل شدن راهاندازی پروژه، ابتدا باید جدولهای مربوط به مدلهای اپلیکیشنهای پیشفرض جنگو که در تنظیم INSTALLED_APPS قرار دارند، در پایگاه داده ایجاد شوند.
جنگو دارای سیستمی به نام مهاجرت | migration است که به شما کمک میکند تغییرات مربوط به ساختار پایگاه داده را مدیریت کنید.
خط فرمان را باز کنید و دستورات زیر را اجرا کنید:
cd mysite python manage.py migrate
شما باید خروجی مشابه زیر را ببینید
Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying auth.0010_alter_group_name_max_length... OK Applying auth.0011_update_proxy_permissions... OK Applying auth.0012_alter_user_first_name_max_length... OK Applying sessions.0001_initial... OK
خطوطی که در بالا دیدید مربوط به مهاجرتهای دیتابیس (database migrations) هستند که توسط جنگو اعمال میشوند.
با اجرای مهاجرتهای اولیه، جدولهای مربوط به اپلیکیشنهایی که در تنظیمات INSTALLED_APPS قرار دارند در دیتابیس ایجاد میشوند.
در بخش Creating and applying migrations این فصل، بیشتر درباره دستور مدیریتیmigrateیاد خواهید گرفت.
جنگو بهصورت پیشفرض یک وبسرور سبک داخلی دارد که به شما اجازه میدهد بدون نیاز به تنظیمات پیچیدهی سرورهای production، خیلی سریع کدتان را اجرا کنید.
وقتی سرور توسعهی جنگو را اجرا میکنید، این سرور بهطور مداوم تغییرات کدنویسی را بررسی میکند. اگر تغییری در کد ایجاد شود، سرور بهصورت خودکار باز-اجرا (reload) میشود و نیازی نیست بعد از هر تغییر، آن را بطور دستی ریستارت کنید.
با این حال، در بعضی موارد مثل اضافه کردن فایل جدید به پروژه، ممکن است سرور متوجه تغییر نشود؛ در این حالت باید سرور را بهصورت دستی ریستارت کنید.
به وسیله دستور زیر در خط فرمان، سرور توسعه شما اجرا خواهد شد:
python manage.py runserver
همچنین باید خروجی مشابه زیر ببینید:
Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). January 01, 2024 - 10:00:00 Django version 5.0, using settings 'mysite.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
اکنون در مرورگر خود به آدرس لوکال هاست با پورت ۸۰۰۰ بروید.
http://127.0.0.1:8000/
یا
http://localhost:8000/
درنهایت صفحه ابتدایی جنگو را میبینید که نشان از اجرای موفقآمیز پروژه است.(مانند تصویر زیر)

اسکرینشاتی که در بالا دیدید نشان میدهد که جنگو در حال اجرا است. اگر به کنسول (console) خود نگاه کنید، درخواست GET که توسط مرورگر شما ارسال شده است را خواهید دید.(چیزی شبیه به زیر)
[01/Jan/2024 10:00:15] "GET / HTTP/1.1" 200 16351
هر درخواست HTTP توسط سرور توسعهی جنگو در کنسول ثبت (log) میشود. همچنین هر خطایی که هنگام اجرای سرور توسعه رخ دهد نیز در کنسول نمایش داده میشود.
شما میتوانید سرور توسعهی جنگو را روی یک host و پورت دلخواه اجرا کنید یا به جنگو بگویید یک فایل تنظیمات (settings) خاص را بارگذاری کند، به شکل زیر:
python manage.py runserver 127.0.0.1:8001 --settings=mysite.settings
نکته: زمانی که با محیطهای مختلفی سر و کار دارید که نیاز به تنظیمات متفاوتی دارند، میتوانید برای هر محیط یک فایل تنظیمات (settings file) جداگانه ایجاد کنید.(مانند محیطهای توسعه، خطایابی، پروداکشن و ...)
این سرور (سرور توسعهی جنگو) فقط برای محیط توسعه (development) در نظر گرفته شده و برای استفاده در محیط واقعی (production) مناسب نیست.
برای استقرار(deploy) جنگو در محیط production، باید آن را بهعنوان یک برنامه WSGI با استفاده از یک وبسرور مانند Apache، Gunicorn یا uWSGI، یا بهعنوان یک برنامه ASGI با استفاده از سروری مثل Daphne یا Uvicorn اجرا کنید.
اطلاعات بیشتر در مورد چگونگی راهاندازی جنگو با وبسرورهای مختلف را میتوانید در آدرس زیر پیدا کنید:
https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/
همچنین، در فصل ۱۷ با عنوان راهاندازی-نهایی|Going Live، نحوهی آمادهسازی محیط production برای پروژههای جنگوی شما را توضیح میدهد.
پست قبلی: (فصل اول - اپیزود ۳ - مرور کلی بر جنگو و معماری آن )
پست بعدی: (فصل اول - اپیزود ۵ - تنظیمات پروژه و فایل settings.py)