بیایید با مثال [پروژه محور] یاد بگیریم.
در این آموزش، شما با ساخت یک برنامه نظرسنجی ساده آشنا می شوید.
این برنامه از دو قسمت تشکیل خواهد شد:
$ python -m django --version
...\> py -m django --version
اگر جنگو نصب شده باشد، باید نسخه نصب خود را ببینید. در غیر اینصورت با خطای “No module named django” مواجه خواهید شد.
این آموزش برای جنگو 3.2 نوشته شده است که از پایتون 3.6 به بعد پشتیبانی می کند. اگر نسخه جنگو مطابقت ندارد، می توانید با استفاده از تغییر دهنده نسخه در گوشه سمت راست پایین این صفحه به آموزش نسخه جنگو خود مراجعه کنید یا جنگو را به جدیدترین نسخه به روز کنید. اگر از نسخه قدیمی تر پایتون استفاده می کنید What Python version can I use with Django? را بررسی کنید تا نسخه سازگار با جنگو را پیدا کنید.
برای راهنمایی در مورد نحوه حذف نسخه های قدیمی جنگو و نصب نسخه جدیدتر، به چگونه جنگو را نصب کنیم؟ مراجعه کنید.
از کجا کمک بگیریم؟
اگر در انجام این آموزش با مشکل مواجه هستید، لطفا به بخش دریافت راهنما در بخش سوالات متداول مراجعه کنید.
اگر برای اولین بار است که از جنگو استفاده می کنید، باید مراقب نصب تنطیمات اولیه باشید. به عبارتی دیگر، شما باید project را بطور خودکار ایجاد کنید تا مجموعه ای تنظیمات از جمله پیکربندی پایگاه داده، گزینه های خاص جنگو و تنظیمات خاص برنامه جنگو را ایجاد کند.
در خط فرمان با زدن دستور cd
و رفتن به دایرکتوری مورد نظر برای ایجاد پروژه خود، دستور زیر را اجرا کنید.
$ django-admin startproject mysite
...\> django-admin startproject mysite
این دستور پوشه ای به نام mysite
در مسیر دایرکتوری اخیر ایجاد می کند. اگر دستور کار نکرد به Problems running django-admin مراجعه کنید.
نکته
شما باید از نامگذاری پروژه مشابه با اسامی موجود در پایتون یا جنگو خودداری کنید.
بطور خاص، استفاده از نامهایی مثل django
(که با نام خود جنگو مغایرت دارد) و یا test
(که با پکیج های آماده پایتون مغایرت دارد) خودداری کنید.
کد ها کجا باید قرار بگیرند؟
اگر بخش پس زمینه وب سایت با PHP بصورت خام (بدون استفاده از هیچ گونه فریم ورک جدیدی) نوشته شده باشد، شما احتمالا نیاز دارید تا کد خود را در وب سرور و مسیر اصلی قرار دهید(بطور مثال مسیری مانند …). با جنگو، نیازی به این کار ندارید. ایده خوبی نیست کد های پایتون خود را در مسیر اصلی وب سرور قرار دهید چراکه احتمال دیده شدن کد های شما در وب برای مردم وجود داشته باشد. و این مورد خوبی برای امنیت وب سایت نیست.
کد خود را خارج از دایرکتوری اصلی مثلا /home/mycode
قرار دهید.
بیایید ببینیم دستور startproject
چه چیزی ایجاد کرده است:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
این فایل ها عبارتند از:
mysite/
فضایی برای پروژه ی شماست. نام این پوشه برای جنگو اهمیتی ندارد. شما هر زمان که بخواهید میتوانید نام آن را تغییر دهید.manage.py
: یک ابزار خط فرمان است که به شما این امکان را می دهد تا به روش های مختلف با پروژه جنگو خود تعامل داشته باشید. می توانید تمام جزییات مربوط به این فایل را در django-admin and manage.py ببینید.mysite/
بسته اصلی پایتون برای پروژه شماست. نام آن نام پکیج پایتون است که باید از آن برای وارد کردن هر چیزی در داخل آن استفاده کنید (برای مثال mysite.urls
).mysite/__init__.py
: یک فایل خالی است که به پایتون می گوید این دایرکتوری باید یک پکیج پایتون در نظر گرفته شود. اگر در پایتون مبتدی هستید، more about packages را در مستندات اصلی پایتون مطالعه کنید.mysite/settings.py
: برای تنظیمات/پیکربندی پروژه جنگو است. Django settings درباره تمامی تنظیمات و نحوه کار کردن آن را توضیح می دهد.mysite/urls.py
: برای اعلام آدرس های اینترنتی برای پروژه جنگو است. به عبارتی یک فهرست قدرتمند از محتویات وب سایت جنگو شماست. برای مطالعه بیشتر میتوانید URL dispatcher را مطالعه کنید.mysite/asgi.py
: برای سازگاری وب سایت جنگو با وب سرور های با قابلیت ASGI است. برای اطلاعات بیشتر How to deploy with ASGI را ببینید.mysite/wsgi.py
: برای سازگاری وب سایت با وب سرورهای با قابلیت WSGI است. برای اطلاعات بیشتر How to deploy with WSGI را مطالعه کنید.بیایید بررسی کنیم که آیا پروژه جنگو کار می کند یا خیر. به دایرکتوری خارجی mysite
رفته و در صورت وجود دستور زیر را در آن مسیر اجرا کنید:
$ python manage.py runserver
...\> py manage.py runserver
با اجرای دستور بالا خروجی زیر را در خط فرمان خواهید دید:
Performing system checks... System check identified no issues (0 silenced). You have unapplied migrations; your app may not work properly until they are applied. Run 'python manage.py migrate' to apply them. July 27, 2022 - 15:50:53 Django version 3.2, using settings 'mysite.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
نکته
هشدار در رابطه با unapplied database migrations را فعلا نادیده بگیرید. به زودی با پایگاه داده سر و کار خواهیم داشت.
شما سرور جنگو را راه اندازی کرده اید. یک وب سرور سبک که بطور کامل صرفا با پایتون نوشته شده است. ما این مورد را با جنگو تلفیق کرده ایم تا بتوانید بدون نیاز به پیکر بندی سرور - مانند آپاچی - تا زمانی که برای تولید نهایی آماده شوید همه چیز را به سرعت توسعه دهید.
اکنون زمان خوبی است که دقت کنید: از این سرور برای محیط تولید استفاده نکنید. این فقط برای استفاده هنگام توسعه در نظر گرفته شده است. (ما در ساخت فریم ورک های وب فعالیت میکنیم نه سرورهای وب)
اکنون که سرور در حال اجرا است، با مرور گر خود به آدرس http://127.0.0.1:8000/ مراجعه کنید. صفحه تبریک! با موشکی که در حال پرتاب است. درست کار کرد.
تغییر پورت
بصورت پیش فرض، دستور runserver
توسعه سرور و وبسایت را روی IP داخلی سیستم و پورت 8000 شروع می کند.
اگر می خواهید پورت سرور خود را تغییر دهید، آن را بصورت آرگومان به خط فرمان بفرستید. برای نمونه، دستور زیر سرور را روی پورت 8080 شروع می کند:
$ python manage.py runserver 8080
...\> py manage.py runserver 8080
اگر می خواهید IP سرور را تغییر دهید، آن را همراه با پورت به عنوان آرگومان پاس دهید. برای مثال، برای گوش دادن به تمام IP های عمومی و قابل رویت (که اگر بصورت سرگردان در حال اجراست یا می خواهید وبسایت خود را روی کامپیوتر دیگری روی شبکه به نمایش بگذارید) از دستور زیر استفاده کنید:
$ python manage.py runserver 0:8000
...\> py manage.py runserver 0:8000
0 کوتاه شده عبارت 0.0.0.0 است.
راهنما و مستندات کامل برای توسعه سرور را می توانید در runserver
پیدا کرده و به آن مراجعه کنید.
بارگذاری مجدد خودکار runserver
سرور توسعه داده شده کدهای پایتون را بصورت خودکار با هر درخواست بسته به نیاز بارگذاری مجدد می کند. شما نیازی نیست که سرور را به ازای هر بار تغییرات مجددا راه اندازی کنید تا تغییرات خود را ببینید. هر چند یک سری عملیات ها مانند اضافه کردن فایل راه اندازی مجدد نمی شوند، پس شما باید سرور را در این موارد دوباره راه اندازی کنید.
حال، محیط شما – پروژه – نصب شده است، شما قرار است شروع به کار کنید.
هر برنامه ای که شما در جنگو می نویسید شامل یک پکیج پایتون است که از یک قرارداد خاص پیروی می کند. جنگو با ابزاری همراه است که بطور خودکار ساختار دایرکتوری اصلی یک برنامه را تولید می کند، بنابراین می توانید به جای ایجاد دایرکتوری ها، روی نوشتن کد تمرکز کنید.
پروژه ها در مقابل برنامه ها
تفاوت یک پروژه و یک برنامه در جنگو چیست؟ منظور از برنامه یک وب اپلیکیشن است که که کاری را انجام می دهد – به عنوان مثال ، یک سیستم وبلاگ، یک پایگاه داده از سوابق عمومی، یا یک برنامه نظرسنجی کوچک. پروژه به مجموعه ای از تنظیمات و برنامه ها برای برای یک وب سایت خاص است. در واقع یک پروژه می تواند شامل چندین برنامه باشد. همینطور یک برنامه می تواند در چندین پروژه باشد.
برنامه های شما در هرجایی از Python path می توانند وجود داشته و اجرا شوند.
در این آموزش، ما برنامه نظرسنجی خود را در همان دایرکتوری فایل manage.py
همانند شما ایجاد خواهیم کرد تا بتوان
آن را به عنوان ماژول سطح بالای خود به جای زیر مجموعه mysite
وارد کرد.
برای ساخت برنامه خود، ابتدا مطمئن باشید که در دایرکتوری manage.py
مشابهی هستیم و سپس دستور زیر را وارد در خط فرمان وارد کنید:
$ python manage.py startapp polls
...\> py manage.py startapp polls
با این کار یک دایرکتوری به نام polls
بصورت زیر ایجاد می شود:
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
این ساختار دایرکتوری برنامه نظرسنجی را در خود جای خواهد داد.
بیایید اولین view وب سایت را بنویسیم. فایل polls/views.py
را باز کنید و و کد پایتون زیر را در آن قرار دهید:
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
این ساده ترین view ممکن در جنگو است. برای فراخوانی view، باید آن را به URL متصل کنیم - برای این کار ما به URLconf نیاز داریم.
برای ساخت URLconf در دایرکتوری polls، فایلی بنام urls.py
بسازید.
دایرکتوری برنامه نظرسنجی شما باید بشکل زیر در بیاید:
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
urls.py
views.py
در فایل polls/urls.py
کد زیر را قرار دهید:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
مرحله بعد URLconf ساخته شده باید به ماژول polls.urls
اشاره کند.
در فایل mysite/urls.py
باید django.urls.include
را بالای فایل ایمپورت کرده و متد include()
را در لیست urlpatterns
اضافه کنید، بنابراین داریم:
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
متد include()
اجازه ارجاع به بقیه ی URLconfs ها را می دهد.
هر زمان که جنگو متد include()
را فراخوانی کند، هر بخشی از URL که تا آن نقطه مطابقت داشته باشد را قطع کرده
و رشته آدرس باقیمانده را برای پردازش بیشتر به URLconf موجود می فرستد.
ایده اصلی include()
این است که اتصال-و-اجرای URLs هارا آسان کنیم.
از آنجاییکه نظرسنجی ها در URLconf خودشان در (polls/urls.py
) هستند،
میتوانند در مسیر “/polls/”، یا در “/fun_polls/”،
یا در مسیر “/content/polls/”، یا در هر مسیر اصلی دیگری در دایرکتوری جنگو قرار بگیرند،
و برنامه همچنان قادر به کار کردن خواهد بود.
چه زمانی از include()
استفاده کنیم؟
وقتی الگوهای دیگر URL را اضافه می کنید، باید همیشه از include()
استفاده کنید.
بجز admin.site.urls
که تنها استثنا در این مورد است.
شما اکنون view ی index
را به URLconf متصل کرده اید.
با دستور زیر بررسی کنید که کار می کند یا خیر:
$ python manage.py runserver
...\> py manage.py runserver
در مرورگر خود به آدرس http://localhost:8000/polls/ رفته، و باید متن “Hello, world. You’re at the polls index.” را که در
view ی index
تعریف کرده بودید روی صفحه مشاهده کنید.
صفحه یافت نشد؟
اگر خطایی در صفحه مشاهده کردید، بررسی کنید که آدرس مرورگر شما با آدرس http://localhost:8000/polls/ مطابقت داشته باشد و http://localhost:8000/ نباشد.
به متد path()
باید 4 آرگومان فرستاده شود، 2 آرگومان: route
و view
ضروری بوده،
ولی دو آرگومان: kwargs
و name
اختیاری هستند.
خوب است در اینجا بررسی کنیم که این آرگومان ها برای چه هستند.
path()
: route
¶route
رشته ای است که حاوی یک الگوی URL است.
جنگو هنگام پردازش یک درخواست، از اولین الگو در urlpatterns
شروع کرده و تا پایین فهرست را می خواند
و URL درخواستی را با هر الگویی که در لیست موجود است مقایسه می کند تا زمانیکه یک الگوی منطبق پیدا کند.
الگو ها پارامتر های GET و POST یا نام دامنه را جستجو نمی کنند.
برای مثال، در یک درخواست به https://www.example.com/myapp/
،
URLconf به دنبال myapp/
می گردد.
همچنین در یک درخواست به https://www.example.com/myapp/?page=3
،
URLconf به دنبال myapp/
نیز می گردد.
path()
: view
¶زمانیکه جنگو یک الگوی منطبق را پیدا می کند، تابع view مشخص شده را با شی HttpRequest
به عنوان اولین آرگومان
و هر مقدار “گرفته شده” از مسیر را به عنوان آرگومان کلیدی فراخوانی می کند.
در ادامه مثالی از این موضوع خواهیم زد.
path()
: kwargs
¶آرگومان های کلیدی دلخواه را می توان در یک فرهنگ لغت به view هدف منتقل کرد. ما قرار نیست از این ویژگی جنگو در آموزش استفاده کنیم.
path()
: name
¶نام گذاری URL به شما امکان می دهد بدون ابهام از قسمت های دیگر جنگو، به ویژه درون قالب ها، به آن مراجعه کنید. این ویژگی قدرتمند به شما این امکان را می دهد که در حالیکه تنها یک فایل را لمس می کنید، تغییرات کلی در الگوهای URL پروژه خود ایجاد کنید.
هنگامی که اصول اولیه جریان درخواست و پاسخ را یاد گرفتید، برای شروع کار با پایگاه داده، part 2 of this tutorial را بخوانید.
Jul 27, 2022