ساخت پروژه در جنگو (Django)؛ از نصب تا استقرار

ساخت پروژه در جنگو (Django)

آنچه در مقاله می‌خوانید

جنگو (Django) یکی از محبوب‌ترین فریم‌ورک‌های وب بر پایهٔ زبان پایتون است که با تمرکز بر سرعت توسعه، امنیت و مقیاس‌پذیری به‌طور گسترده در پروژه‌های کوچک و بزرگ وب مورد استفاده قرار می‌گیرد. هدف اصلی جنگو این است که برنامه‌نویسان و تیم‌های توسعه بتوانند در کم‌ترین زمان ممکن، نرم‌افزارهای تحت وب باکیفیت و استاندارد ایجاد کنند. جنگو دارای معماری موسوم به MTV (Model-Template-View) است که سازمان‌دهی کد را ساده می‌کند و به توسعه‌دهندگان امکان می‌دهد تا منطق تجاری، بخش نمایشی (Front-End) و لایهٔ داده را از هم جدا نگه دارند. ساخت پروژه در جنگو اولین گام برای بهره‌گیری از قدرت این فریم‌ورک محبوب وب است. جنگو به دلیل فلسفه‌ی “همراه با همه‌چیز”، مجموعه‌ای کامل از ابزارها را برای توسعه‌دهندگان فراهم می‌کند که شامل احراز هویت کاربران، مدیریت محتوا و مدیریت پایگاه داده می‌شود. این ترکیب ویژگی‌ها، جنگو را به گزینه‌ای ایده‌آل برای ساخت وب‌سایت‌ها و برنامه‌های پویا و مبتنی بر داده تبدیل کرده است.  در این آموزش، شما را مرحله‌به‌مرحله در فرآیند راه‌اندازی و ایجاد اولین پروژه جنگو راهنمایی خواهیم کرد.

مروری کوتاه بر جنگو

جنگو فریم‌ورکی سطح بالا (High-Level) برای ساخت برنامه‌های تحت وب است که کار خود را از یک مجموعه توسعه‌دهنده در روزنامه‌ای محلی آغاز کرد. هدف آن‌ها ساخت ابزاری بود تا بتوانند سریعاً وب‌سایت‌های خبری با محتوای پویا و قابلیت به‌روزرسانی مداوم ایجاد کنند. خروجی تلاش آن‌ها، فریم‌ورکی شد که به صورت متن‌باز ارائه گردید و از آن زمان تا امروز، هزاران برنامه‌نویس در سراسر جهان از جنگو در پروژه‌های مختلف استفاده کرده‌اند.

اصلی‌ترین مزایا و ویژگی‌های جنگو عبارت‌اند از:

  • سرعت توسعه بالا: شما می‌توانید با جنگو در زمان کم، بخش‌های مهمی از یک پروژهٔ وب را ایجاد و راه‌اندازی کنید.

  • معماری مرتب (MTV): جداسازی منطق برنامه (Models)، بخش ارائهٔ داده به کاربر (Views) و قالب‌های نمایشی (Templates)، سبب تمیز ماندن کد و نگهداری آسان آن می‌شود.

  • امنیت: جنگو به صورت پیش‌فرض بسیاری از حملات رایج مانند SQL Injection، XSS و CSRF را کنترل می‌کند.

  • قابلیت توسعه و انعطاف: جنگو با داشتن ساختاری ماژولار و انعطاف‌پذیر، امکان افزودن قابلیت‌های جدید را به آسانی فراهم می‌کند.

  • جامعهٔ فعال: وجود انجمن‌های مختلف و مستندات جامع سبب شده تا تقریباً برای اکثر چالش‌های شما در توسعه، پاسخ و راهکار وجود داشته باشد.

پیش‌نیازها و نصب جنگو

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

تهیه سرور و نصب پایتون

ابتدا اطمینان حاصل کنید که آخرین نسخهٔ پایدار پایتون (نسخه ۳.۸ یا بالاتر) را روی سیستم خود نصب دارید.

می‌توانید از طریق خط فرمان یا ترمینال دستور زیر را بزنید:

python --version

همچنین، توصیه می‌شود که یک محیط مجازی پایتون (Virtual Environment) راه‌اندازی کنید تا داده‌های برنامه‌ی شما از سایر پروژه‌ها و سرویس‌های سیستم جدا بماند.

اگر نسخهٔ پایتون ۳ را مشاهده کردید، یعنی پایتون نصب است و می‌توانید وارد مراحل بعد شوید. در غیر این صورت، با مراجعه به وب‌سایت Python.org نسخهٔ مناسب برای سیستم‌عامل خود را دریافت و نصب کنید.

ایجاد و فعال‌سازی محیط مجازی

در پایتون ۳، ابزار venv به صورت پیش‌فرض در اکثر سیستم‌ها موجود است. با این ابزار می‌توانید یک محیط مجازی ایجاد کنید. برای مثال دستور زیر را در پوشه‌ای که می‌خواهید پروژهٔ جنگو خود را بسازید، اجرا کنید:

python -m venv venv

این دستور یک پوشه با نام venv ایجاد می‌کند که حاوی پایتون و کتابخانه‌های مربوط به آن خواهد بود. سپس برای فعال کردن محیط مجازی، دستور زیر را بسته به سیستم‌عامل خود اجرا کنید:

venv\Scripts\activate

بعد از فعال‌سازی محیط مجازی، ابتدای خط فرمان شما نام محیط مجازی (مثلاً (venv)) نشان داده می‌شود.

نصب جنگو

اکنون که محیط مجازی فعال است، به سادگی جنگو را با دستور زیر نصب کنید:

pip install django
یا اگر نیاز دارید از نسخهٔ خاصی از جنگو استفاده کنید، نسخه را مشخص نمایید:
pip install django==3.2
همچنین بهتر است پس از نصب، با دستور pip freeze لیست کتابخانه‌های نصب شده را ببینید یا فایل requirements.txt بسازید. مثلاً:
pip freeze > requirements.txt
این فایل بعداً هنگام استقرار پروژه یا اشتراک‌گذاری کد با هم‌تیمی‌ها مفید واقع می‌شود.

ایجاد یک پروژه جدید جنگو

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

قبل از ادامه، باید از طریق SSH به سرور خود متصل شوید. برای انجام این کار می‌توانید از PuTTY یا Terminal استفاده کنید.


پس از آماده‌سازی محیط، نوبت ساخت پروژه جدید در جنگو است. دستور زیر، پروژه‌ای جدید به نام myproject ایجاد می‌کند. با توجه به نامی که دوست دارید، آن را تغییر دهید:

django-admin startproject myproject

این دستور پوشه‌ای به نام myproject و فایل‌های زیر را می‌سازد:

  1. manage.py: فایل اجرایی اصلی برای دستورات مدیریتی جنگو نظیر راه‌اندازی سرور محلی، اعمال مهاجرت‌ها، ایجاد اپلیکیشن جدید و غیره.

  2. myproject/__init__.py: یک فایل خالی که نشان می‌دهد این پوشه یک بسته (Package) پایتونی است.

  3. myproject/asgi.py: تنظیمات مرتبط با پروتکل ASGI (Asynchronous Server Gateway Interface) که در جنگو برای پشتیبانی از برنامه‌های ناهم‌زمان به کار می‌رود.

  4. myproject/wsgi.py: تنظیمات مرتبط با پروتکل WSGI (Web Server Gateway Interface) برای استقرار پروژه روی سرورهای متداول.

  5. myproject/settings.py: فایل تنظیمات اصلی پروژه نظیر تعریف پایگاه داده، برنامه‌های نصب شده (INSTALLED_APPS)، تنظیمات امنیتی، مدیریت فایل‌های استاتیک و غیره.

  6. myproject/urls.py: فایل مربوط به پیکربندی آدرس‌های سراسری پروژه.

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

سپس، به پوشه‌ی ساخته شده پروژه بروید:

cd myproject/myproject

تنظیم فایل settings.py

فایل settings.py را با یکی از ویرایشگرهای متنی پیش‌فرض Ubuntu مانند vim یا nano باز کنید. در اینجا از vim استفاده می‌کنیم:

vim settings.py

در این فایل، گزینه ALLOWED_HOSTS را پیدا کرده و آی‌پی VPS خود را به‌صورت زیر اضافه کنید:

Python

ALLOWED_HOSTS = [‘your_vps_ip’]

این تنظیم باعث می‌شود سرور شما بتواند پروژه جنگو را اجرا و در دسترس قرار دهد.

برای ذخیره تغییرات و خروج از vim، دستور زیر را وارد کنید:

:wq

برای اطمینان از اینکه همه چیز به درستی تنظیم شده است، باید سرور توسعه جنگو را اجرا کنید. ابتدا به پوشه اصلی پروژه برگردید:

cd ..

سپس، دستور زیر را برای اجرای سرور وارد کنید:

python manage.py runserver 0.0.0.0:8000

با اجرای این دستور، خروجی مشابه زیر ظاهر خواهد شد:

Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

اکنون مرورگر خود را باز کرده و آدرس زیر را وارد کنید:

http://your_vps_ip:8000/

(به جای your_vps_ip، آدرس آی‌پی واقعی VPS خود را قرار دهید.)

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

ایجاد اپلیکیشن در جنگو

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

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

python manage.py startapp blog

این دستور پوشه‌ای به نام blog ایجاد می‌کند که فایل‌های زیر را در بر دارد:

  1. blog/models.py: تعریف مدل‌های پایگاه داده در این فایل انجام می‌شود.

  2. blog/views.py: تابع‌ها و کلاس‌های کنترل‌کننده منطق درخواست-پاسخ در این فایل قرار می‌گیرد.

  3. blog/admin.py: برای ثبت مدل‌ها در بخش مدیریت جنگو (Django Admin) استفاده می‌شود.

  4. blog/apps.py: پیکربندی اپلیکیشن؛ جنگو از این فایل برای شناسایی اپلیکیشن در پروژه بهره می‌برد.

  5. blog/migrations/__init__.py: فایل مرتبط با مهاجرت‌ها که تغییرات مدل‌ها را ردیابی می‌کند.

  6. tests.py: فایل پیش‌فرض تست‌ها در جنگو.

برای این‌که جنگو اپلیکیشن جدید را بشناسد و آن را مدیریت کند، باید در فایل settings.py قسمت INSTALLED_APPS، نام اپلیکیشن را اضافه کنید. مثلاً:

INSTALLED_APPS = [
...,
'blog.apps.BlogConfig',
]

ساخت مدل‌ها (Models)

مدل‌ها در جنگو وظیفه نگهداری و سازمان‌دهی داده‌ها را بر عهده دارند. هر مدل نمایانگر جدولی در پایگاه داده است و هر ویژگی (فیلد) در کلاس مدل به منزلهٔ ستونی در آن جدول خواهد بود. جنگو از ORM (Object-Relational Mapping) قدرتمندی برخوردار است که نیاز شما به نوشتن مستقیم کوئری‌های SQL را به حداقل می‌رساند.

به عنوان مثال، در فایل models.py مربوط به اپلیکیشن blog می‌توان یک مدل ساده برای پست‌های وبلاگ ایجاد کرد:

from django.db import models

class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

def __str__(self):
return self.title

در این مدل:

  • title عنوان پست است و از نوع CharField با حداکثر طول ۲۰۰ کاراکتر.

  • content محتوای پست است و از نوع TextField که می‌تواند متن طولانی را ذخیره کند.

  • created_at زمان ایجاد پست را ذخیره می‌کند و با auto_now_add=True به طور خودکار مقدار زمان ایجاد شدن را در اولین مرتبه ثبت می‌کند.

  • updated_at زمان به‌روزرسانی پست را ذخیره می‌کند و با auto_now=True در هر ذخیره (Save) به‌روزرسانی می‌شود.

  • متد __str__ تعیین می‌کند که وقتی در جای دیگری (مثلاً در ادمین پنل) به یک شئ Post ارجاع داده می‌شود، با چه متنی نشان داده شود. اینجا ما انتخاب کردیم با عنوان پست نمایش داده شود.

برای اعمال این مدل به پایگاه داده، ابتدا باید از دستور زیر برای ساخت فایل مهاجرت استفاده کنید:

python manage.py makemigrations

سپس با دستور زیر تغییرات اعمال شده را در پایگاه داده اعمال نمایید:

python manage.py migrate

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

پیاده‌سازی ویوها

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

در ساده‌ترین حالت، یک ویو می‌تواند یک تابع پایتونی باشد که شیء درخواست (Request) را دریافت و یک شیء پاسخ (Response) بازمی‌گرداند. برای مثال، در فایل views.py اپلیکیشن blog یک ویو ساده برای نمایش لیست پست‌ها را به این شکل بنویسیم:

from django.shortcuts import render
from .models import Post

def post_list(request):
posts = Post.objects.all().order_by('-created_at')
return render(request, 'blog/post_list.html', {'posts': posts})

در این کد:

  • ابتدا از فایل models.py، مدل Post را وارد کرده‌ایم.

  • متغیر posts شامل تمام پست‌های موجود در جدول blog_post خواهد شد که به ترتیب نزولی تاریخ ایجاد شده (created_at) مرتب‌سازی می‌شوند.

  • تابع render شیوهٔ رایجی در جنگو برای بازگرداندن یک قالب به همراه محتوایی از پایگاه داده است. به این تابع مسیر فایل قالب (blog/post_list.html) و دیکشنری محتوایی جهت استفاده در آن قالب را پاس می‌دهیم.

پیکربندی URL ها

برای این‌که ویوی ما در دسترس باشد، باید آن را در سامانهٔ مسیرها (URLs) ثبت کنیم. جنگو دو راه متداول برای مدیریت مسیرها دارد:

  1. تعریف همهٔ مسیرها در فایل urls.py سطح پروژه (فایل myproject/urls.py).

  2. استفاده از فایل urls.py در هر اپلیکیشن مجزا و سپس ارجاع آن از فایل اصلی.

معمولاً روش دوم توصیه می‌شود؛ چرا که باعث ساختارمند شدن پروژه و جداسازی بهتر ماژول‌ها می‌شود. در این روش، ابتدا در فایل blog/urls.py (خودتان باید آن را ایجاد کنید) مسیر مربوط به ویو post_list را تعریف کنید:

from django.urls import path
from .views import post_list

urlpatterns = [
path('', post_list, name='post_list'),
]

سپس در فایل myproject/urls.py مسیرهای پروژه را این‌گونه تنظیم کنید:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')),
]

حالا اگر در مرورگر به آدرس http://127.0.0.1:8000/blog/ بروید، ویوی post_list فراخوانی می‌شود. دقت کنید که در این آدرس، مسیر blog/ مطابق با عبارتی است که در myproject/urls.py تعیین کردیم و آدرس خالی '' در blog/urls.py در نهایت یکپارچه شده و URL کامل را تشکیل می‌دهد.

قالب‌ها (Templates)

یکی از اجزای کلیدی در معماری جنگو بخش قالب‌ها (Templates) است که به شما اجازه می‌دهد کد HTML را با داده‌های دینامیک ترکیب کنید. جنگو از یک موتور قالب‌نویسی پیش‌فرض استفاده می‌کند که امکان استفاده از تگ‌ها و فیلترهای سفارشی دارد.

برای سازمان‌دهی فایل‌های قالب، معمولاً پوشه‌ای به نام templates در داخل هر اپلیکیشن یا در مسیر کلی پروژه ایجاد می‌شود. اگر از ساختار معمول پروژهٔ جنگو پیروی کنید، شاید نیاز باشد در فایل settings.py بخش TEMPLATES را هم مطابق ساختار دلخواه پیکربندی کنید. برای سادگی، در اکثر پروژه‌ها می‌توان مسیر کلی زیر را به عنوان مثال قرار داد:

import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')], 
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
...
],
},
},
]

اگر قصد دارید فایل‌های قالب را در اپلیکیشن blog نگه دارید، معمولاً ساختار زیر پیشنهاد می‌شود:

blog/
templates/
blog/
post_list.html

در فایل post_list.html می‌توانیم یک نمونهٔ ساده از استفادهٔ داده‌ها و حلقه‌ها را به شکل زیر ببینیم:

<!DOCTYPE html>
<html>
<head>
<title>لیست پست‌ها</title>
</head>
<body>
<h1>پست‌های وبلاگ</h1>
<ul>
{% for post in posts %}
<li>
<strong>{{ post.title }}</strong> – {{ post.created_at }}
</li>
{% endfor %}
</ul>
</body>
</html>

در این مثال:

  • از تگ قالبی {% for %} برای تکرار روی لیست پست‌ها استفاده کرده‌ایم.

  • متغیر‌های داخل شیء post را با {{ variable }} فراخوانی می‌کنیم.

  • در نهایت با {% endfor %} حلقه را می‌بندیم.

جنگو تگ‌ها و فیلترهای متنوعی برای قالب دارد؛ برای مثال، می‌توانید تاریخ‌ها را به فرمت‌های مختلف نمایش دهید یا عبارتی را خلاصه کنید.

فایل‌های استاتیک (Static Files)

در کنار فایل‌های HTML، پروژهٔ شما قطعاً شامل فایل‌های CSS، JavaScript و تصاویر خواهد بود. در جنگو، مدیریت فایل‌های استاتیک به عهدهٔ سیستمی است که آن‌ها را از پوشه‌های مختلف جمع می‌کند و در حالت توسعه یا تولید، قابل دسترس قرار می‌دهد.

با تنظیماتی که در فایل settings.py دارید، معمولاً باید STATIC_URL و STATICFILES_DIRS را مشخص کنید. مثلاً:

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

سپس در پوشهٔ static می‌توانید ساختار دلخواه خود را داشته باشید:

static/
css/
styles.css
js/
main.js
images/
logo.png

در قالب‌ها نیز می‌توانید با {% load static %} از این فایل‌ها استفاده کنید:

{% load static %}
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="{% static 'css/styles.css' %}">
</head>
<body>
<h1>سلام دنیا</h1>
<script src="{% static 'js/main.js' %}"></script>
</body>
</html>

نکته: برای محیط توسعه، جنگو به طور پیش‌فرض می‌تواند فایل‌های استاتیک را سرو کند، اما برای محیط تولید (Production) بهتر است از وب‌سروری نظیر Nginx یا Apache برای ارائه کردن فایل‌های استاتیک استفاده کنید.

پیکربندی پنل ادمین

یکی از نقاط قوت جنگو، داشتن یک پنل مدیریت آماده و قدرتمند است که به شما امکان می‌دهد مدل‌های خود را در محیطی گرافیکی مدیریت کنید. برای استفاده از آن، باید در فایل blog/admin.py مدل‌های موردنظر را ثبت کنید:

from django.contrib import admin
from .models import Post

admin.site.register(Post)

حالا اگر سرور محلی جنگو در حال اجرا باشد، با رفتن به آدرس http://127.0.0.1:8000/admin/ و وارد کردن نام کاربری و رمز عبور سوپر یوزر (Superuser)، می‌توانید وارد پنل مدیریت شوید. اگر هنوز کاربر مدیر نساخته‌اید، با دستور زیر می‌توانید آن را ایجاد کنید:

python manage.py createsuperuser
سپس با وارد کردن ایمیل، نام کاربری و رمز عبور، یک اکانت سوپریوزر ساخته می‌شود. در صفحهٔ مدیریت، می‌توانید سوابق پست‌های وبلاگ را مشاهده و اضافه، حذف یا ویرایش کنید. با انجام پیکربندی‌های بیشتر و استفاده از امکانات اضافه‌ای مانند ModelAdmin، قادر خواهید بود فیلدهای مختلف را در قالب‌های سفارشی نمایش دهید، جست‌وجو یا فیلتر داشته باشید و حتی گراف‌های آماری ساده تولید کنید.

Migrations

جنگو از سیستمی به نام Migrations استفاده می‌کند تا تغییرات در مدل‌ها را ردیابی و در پایگاه داده اعمال کند. هر بار که مدل‌های شما تغییر کند (فیلدی اضافه شود، نام فیلدی تغییر کند، یک مدل جدید ایجاد شود و …)، باید مراحل زیر را انجام دهید:

ساخت فایل migration با دستور:

python manage.py makemigrations

اجرای Migration:

python manage.py migrate

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

تست و اشکال‌زدایی

کیفیت و پایداری یک پروژهٔ نرم‌افزاری وابستگی زیادی به تست‌های جامعی دارد که برای آن نوشته شده است. جنگو یک چارچوب پیش‌فرض برای تست دارد که بر پایهٔ ماژول استاندارد unittest پایتون بنا شده است. فایل tests.py در هر اپلیکیشن مکانی ایده‌آل برای نوشتن تست‌ها است.

به عنوان مثال، اگر بخواهیم در اپلیکیشن blog یک تست ساده بنویسیم این کار را با استفاده از دستور زیر انجام می‌دهیم:

from django.test import TestCase
from .models import Post

class PostModelTest(TestCase):
    def test_post_creation(self):
        post = Post.objects.create(title='Test Post', content='Just a test')
        self.assertEqual(post.title, 'Test Post')
        self.assertEqual(post.content, 'Just a test')

برای اجرای تست‌ها، کافی است دستور زیر را در ترمینال در پوشهٔ پروژه اجرا کنید:

python manage.py test

تمام تست‌های تعریف شده در تمام اپلیکیشن‌های پروژه اجرا می‌شوند و گزارش موفقیت یا شکست هر تست نمایش داده می‌شود.

۲. اشکال‌زدایی

برای اشکال‌زدایی نیز جنگو هنگامی که DEBUG = True باشد، خطاها را با Traceback کامل نشان می‌دهد که می‌تواند در توسعه بسیار مفید باشد. اما به یاد داشته باشید که در محیط تولید، همواره باید DEBUG = False باشد تا اطلاعات حساس سرور شما افشا نشود.

درک ساختار پروژه جنگو

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

ساختار کلی پروژه جنگو به شکل زیر است:

تصویری از ساختار پیش‌فرض پروژه جنگو: فایل‌های db.sqlite3 و manage.py در پوشه‌ی اصلی myproject قرار دارند و فایل‌های __init__.py، asgi.py، settings.py، urls.py، wsgi.py و پوشه‌ی __pycache__ در پوشه‌ی داخلی myproject دیده می‌شوند.

myproject/

دایرکتوری اصلی پروژه که شامل تنظیمات، پیکربندی‌ها و سایر فایل‌های پیش‌فرض پروژه جنگو است.

فایل manage.py

manage.py یک ابزار خط فرمان است که به شما امکان تعامل با پروژه جنگو را می‌دهد. از این فایل برای انجام وظایف مختلفی مانند اجرای سرور توسعه، مهاجرت پایگاه داده و مدیریت برنامه استفاده می‌شود.

تصویری از فایل پیش‌فرض manage.py که در ویرایشگر VS Code باز شده است.

وظایف کلیدی این فایل:

تنظیم متغیر محیطی:

Python

  os.environ.setdefault(‘DJANGO_SETTINGS_MODULE’, ‘myproject.settings’)

 

این دستور متغیر محیطی را تنظیم می‌کند تا جنگو بداند از کدام فایل تنظیمات استفاده کند.

 

اجرای دستورات جنگو:

Python

execute_from_command_line(sys.argv)

 

این خط کد وظیفه اجرای دستورات مختلف جنگو مانند runserver`، `migrate و سایر دستورات را بر عهده دارد.

 

فایل __init__.py

این فایل دایرکتوری پروژه را به یک بسته پایتون (Python Package) تبدیل می‌کند، که این امکان را فراهم می‌سازد تا کد پروژه شما به‌عنوان یک ماژول در پایتون ایمپورت (Import) شود.

این فایل به‌صورت پیش‌فرض خالی است.

فایل settings.py

یکی از مهم‌ترین فایل‌های جنگو، settings.py است. این فایل شامل تمام تنظیمات پروژه شما، از جمله موارد زیر است:

  • پیکربندی پایگاه داده
  • برنامه‌های نصب‌شده (INSTALLED_APPS)
  • میان‌افزارها (Middleware)
  • تنظیمات فایل‌های استاتیک

تمام تغییرات و تنظیمات اصلی پروژه از طریق این فایل انجام می‌شود.

فایل urls.py

این فایل مسیرهای URL را برای برنامه شما تعریف می‌کند. وظیفه اصلی آن اتصال URLها به ویوها (Views) است تا درخواست‌های کاربر پردازش شده و پاسخ مناسب ارسال شود.

تصویری از ساختار پیش‌فرض فایل urls.py در جنگو.

به‌مرور که ویژگی‌های بیشتری به برنامه خود اضافه می‌کنید، مسیرهای جدیدی را به `urlpatterns` اضافه خواهید کرد.

فایل asgi.py

این فایل نقطه ورودی (Entry Point) برای سرورهای وب ASGI است که از پروژه شما پشتیبانی می‌کنند.

تصویری از ساختار پیش‌فرض فایل asgi.py در جنگو.

ASGI مخفف Asynchronous Server Gateway Interface است و استانداردی برای اجرایبرنامه‌های جنگو به‌صورت غیرهمزمان (Asynchronous) محسوب می‌شود.

فایل wsgi.py

این فایل نقطه ورود (Entry Point) برای سرورهای وب سازگار با WSGI مانند Gunicorn یا uWSGI است که پروژه شما را در یک محیط تولید (Production) اجرا می‌کنند.

تصویری از ساختار پیش‌فرض فایل wsgi.py در جنگو.

درک نقش هر فایل و دایرکتوری به شما این امکان را می‌دهد که تنظیمات را تغییر دهید، مسیرهای URL را اضافه کنید و ساختار پروژه خود را مدیریت کنید.

نکات امنیتی در جنگو

جنگو توصیه‌ها و ابزارهای متعددی برای ارتقای امنیت پروژه ارائه می‌کند. برخی نکات کلیدی عبارت‌اند از:

  1. تنظیم کلید مخفی (SECRET_KEY): این کلید در فایل settings.py برای امضا و رمزگذاری داده‌ها استفاده می‌شود و نباید در مخزن عمومی (نظیر GitHub عمومی) قرار گیرد.

  2. مکانیزم CSRF: جنگو به صورت پیش‌فرض از تزریق توکن CSRF در فرم‌ها استفاده می‌کند تا از حملهٔ Cross Site Request Forgery جلوگیری کند.

  3. فیلتر XSS: تمپلیت انجین جنگو با فرار دادن (Escape) مقادیر ورودی، تا حد زیادی از حملات XSS جلوگیری می‌کند.

  4. تنظیمات Allowed Hosts: در فایل settings.py، حتماً باید دامنه یا IP سرور خود را در لیست ALLOWED_HOSTS قرار دهید تا از دسترسی‌های ناخواسته جلوگیری شود.

  5. HTTPS: توصیه می‌شود در محیط تولید، از پروتکل امن HTTPS استفاده کنید و تنظیماتی نظیر SECURE_SSL_REDIRECT را فعال نمایید.

استقرار (Deployment) در محیط تولید

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

  1. استقرار روی سرور مجازی (VPS) با استفاده از وب‌سرورهایی نظیر Gunicorn یا uWSGI به عنوان WSGI و Nginx به عنوان reverse proxy.

  2. استفاده از سرویس‌های ابری که با چندین دستور ساده از طریق داکر یا پکیج جنگو به راحتی امکان استقرار را فراهم می‌کنند.

  3. استفاده از Docker برای ایجاد یک کانتینر ایزوله که دارای پایتون، جنگو و تمام وابستگی‌های پروژه است. سپس کانتینر را در سرویس‌هایی نظیر AWS، Google Cloud یا Azure بالا بیاورید.

نتیجه‌گیری

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

5/5 - (1 امتیاز)
دیدن نظرات
small

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

پانزده − چهارده =

عضویت در خبرنامه مبین هاست
مطالب کدام دسته‌بندی‌ها برای شما جذاب‌تر است؟

آنچه در مقاله می‌خوانید

مقالات مرتبط
فریمورک Django
آموزش برنامه نویسی

همه چیز درباره فریمورک Django و نحوه استفاده از آن

فریم ورک Django یک ابزار متن‌باز بر پایه زبان برنامه‌نویسی پایتون است که از آن برای ساخت انواع وب‌سایت‌ها و پلتفرم‌های پیچیده استفاده می‌شود. این

خدمات مبین هاست