استفاده از APIها در URL

جنگو

سلام

حالا می خواهیم صفحۀ مربوط به تاپیک‌های یک بورد را کدنویسی کنیم. اولین کار این است که فایل urls.py را ویرایش کنیم:

Libogram/urls.py

و حالا نوبت نوشتن تابع view است.

boards/views.py

در فولدر templates یک فایل جدید با نام topics.html می سازیم:

templates/topics.html

صفحۀ مربوطه با آدرس http://127.0.0.1:8000/boards/1 را در مرورگر چک می کنیم:

حالا نوبت نوشت فایل tests.py است.

boards/tests.py

در این تست، از یک متد به نام setUp استفاده شده. در این متد ما یک شی از نوع Board را به صورت موقتی ایجاد می کنیم و تست خود را با آن انجام می دهیم. جنگو در زمان تست، تغییری در دیتابیس اصلی ایجاد نمی کند و ما ناچار به این هستیم که یک دیتابیس در هوا ایجاد کنیم و تمام تغییرات مهاجرتی، اجرای تست‌ها و… را به وسیلۀ آن انجام داده و در آخر هم آن را از بین ببریم. در متد setUp  محیطی برای تست تعریف شده است.

    • test_board_topics_view_success_status_code: برای بوردهای موجود کد حالت یا همان Status Codeای برابر با 200 را باز می گرداند.
    • test_board_topics_view_not_found_status_code: اگر وجود نداشت کد 404 یا همان Page Not Found را باز می گرداند.
    • test_board_topics_url_resolves_board_topics_view: بیانگر این است که جنگو از تابع صحیحی جهت view برای نمایش تاپیک‌ها استفاده می کند.

حالا می خواهیم تست خود را اجرایی کنیم:

اما خروجی همراه با خطا خواهد بود:

اگر صفحۀ مرورگر را هم باز کنیم خطای boards.models.DoesNotExist: Board matching query does not exist مشاهده می شود.

اگر هم که در تنظیمات سرور مقدار DEBUG=False باشد، کاربران صرفاً صفحۀ مربوط به خطای 500 Internal Server Error را می بینند.

برای تمرین می خواهیم صفحۀ 404 را از نو برنامه نویسی کنیم:

boards/views.py

دوباره دستور تست را اجرا می کنیم:

خروجی

بله دیگه! همانطوری که انتظار داشتیم اجرا می شود:

حالا می خواهیم ویوی board_topics را از نو بنویسیم:

دوباره تست می کنیم:

خروجی:

اقدام بعدی این است که باید نام بوردها را به صورت لینک درست کنیم تا کاربر با کلیک روی آن به صفحه‌ای انتقال یابد که تاپیک‌های مربوط به آن بورد در آن نمایش داده می‌شود.

برای شروع کار، برای کلاس HomeTests باید متدهای تست را پیاده سازی کنیم:

boards/tests.py

در این کلاس هم تابع setUp پیاده سازی شده و علت آن هم این است که باید یک شی موقت از Board ایجاد کنیم و  url و response را به  setUp انتقال دهیم و با این کار از ریسپانس یکسانی دوباره استفاده کنیم.

تست جدید همان test_home_view_contains_link_to_topics_page است. در متد assertContains چک می شود که آیا response body شامل محتوایی هست یا نه. محتوایی که در فایل تست استفاده می شود همان href  از تگ a است. پس به زبان ساده چک می کنیم که آیا response body شامل “/href=”/boards/1 می شود یا خیر.

تست می کنیم:

خروجی:

حالا کدی می نویسیم که مشکل این تست برطرف شود.

templates/home.html

در واقع صرفا {{ board.name }} به <a href=”{% url ‘board_topics’ board.pk %}”>{{ board.name }}</a> تغییر یافته است.

یکی از تگ‌های تمپلیت در جنگو {% url %} است که از طریق آن آدرس اپلیکیشن ارسال می شود. پارامتر اول نامِ url است که در urls.py تعریف شده است. (نام و شناسۀ یکتا برای هر آدرس) و بعد از آن هم می توان هر تعداد آرگومانی که نیاز است را ارسال نمود.

اگر هم که آدرس از نوع ساده و ابتدایی باشد نیاز به دنباله نداشته و برای مثال به {% url ‘home’ %} اکتفاء می کنیم.

تست می کنیم:

خروجی:

و این هم خروجی برنامه در مرورگر:

حالا که Django به شکل یک لینک در آمد باید تست مربوط به آن را هم بنویسیم:

boards/tests.py

تست می کنیم:

خروجی:

خطا می دهد چون فایل تمپلیت را آپدیت نکرده ایم.

templates/topics.html

تست می کنیم:

خروجی:

و این هم خروجی در مرورگر:

اگر دو سه بار این بخش خوانده شود مشخص می شود که هیچ کار سخت و پیچیده ای انجام نشده و صرفاً نوشتن فایل‌های تست کمی ظرافتکاری دارد وگرنه که یک صفحه در تمپلیت ساختیم و آن را به صورت لینکی قرار دادیم و متناظر آن را هم در فایل view و url . همین!

ترجمۀ اختصاصی توسط تمدن

 

مطلب بعدی: لیستی از الگوهای پرکاربرد URL 

مطلب قبلی: URLهای پیشرفته 

بدون دیدگاه

پاسخی بگذارید

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

جنگو
پیکربندی گواهینامۀ https

سلام حالا می خواهیم برنامۀ خودمان را با گواهینامۀ https امن کنیم. ساده ترین کار برای انجام آن Let’s Encrypt است. قبل از Let’s Encrypt هرگز تنظیمات https به این راحتی نبوده و مهمتر اینکه اینکار کاملاً رایگان است. آن ها راه حلی به نام certbot را ارائه داده اند …

جنگو
پیکربندی سرویس ایمیل

سلام یکی از بهتر سرویس دهنده های ایمیل Mailgun با قابلیت ۱۲ هزار ایمیل رایگان در ماه است. به صورت رایگان ثبت نام کنید. برای اینکار باید آن را با سرویس دهندۀ دامین خود تنظیم کنید که در این آموزش از tamadon.org استفاده شده است. حالا اولین رکورد DNS را …

جنگو
پیکربندی NGINX

سلام کار بعدی که قرار است انجام شود؛ تنظیمان Nginx به شکلی است که پاسخگویی و سرویس دهی مربوط به فایل های استاتیک را خود انجام دهد و سایر درخواست ها را به Gunicorn بفرستد. یک فایل پیکربندی با نام boards را درون /etc/nginx/sites-available/ و با محتوای زیر اضافه می …

هرگونه استفادۀ از این آموزش به صورت رایگان و با ارجاع به تمدن جایز است.