ساختن صفحه‌های خطای شخصی

در فصل ۱۹ پروژه را طوری پیکربندی کردیم که اگر کاربر صفحه‌ای را درخواست کرد که وجود نداشت یا نوشته‌ای را که متعلّق به او نبود درخواست کرد، یک خطای 404 برگرداند. شما احتمالاً تا الان به برخی خطاهای سرور 500 (خطاهای داخلی) برخورده‌اید. خطای 404 معمولاً به این معنی است که کد جانگو درست است امّا چیزی که درخواست می‌شود وجود ندارد؛ خطای 500 به طور معمول به این معنی است که در کدی که نوشته‌اید خطایی وجود دارد، مانند خطایی در یک تابع در views.py. هم‌اکنون جانگو همان صفحه‌ی خطای عمومی را در هر دو وضعیّت برمی‌گرداند. امّا می‌توانیم قالب صفحه‌های خطای 404 و 500 خودمان را بنویسیم که به ظاهر کلّی پروژه می‌خورد. این قالب‌ها باید در پوشه‌ی ریشه‌ی قالب‌ها قرار بگیرند.

ساختن قالب‌های شخصی

در بیرونی‌ترین پوشه‌ی learning_log پوشه‌ای به نام templates بسازید. سپس فایلی جدید به نام 404.html بسازید؛ مسیر این فایل باید learning_log/templates/404.html باشد. این کد این فایل است:

{% extends "learning_logs/base.html" %}

{% block page_header %}
  <h2>The item you requested is not available. (404)</h2>
{% endblock page_header %}

این قالب ساده اطّلاعات صفحه‌ی خطای 404 را در اختیار می‌گذارد امّا شکل آن مانند بقیه‌ی سایت است.

فایلی دیگر به نام 500.html با کد زیر بسازید:

{% extends "learning_logs/base.html" %}

{% block page_header %}
  <h2>There has been an internal error. (500)</h2>
{% endblock page_header %}

این دو فایل جدید به تغییر کوچک در settings.py نیاز دارند:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
--snip--
TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, 'templates')],
    'APP_DIRS': True,
--snip--
},
]
--snip--

این تغییر به جانگو می‌گوید که داخل پوشه‌ی ریشه‌ی قالب‌ها به دنبال قالب صفحه‌های خطا بگردد.

دیدن صفحه‌های خطا به صورت محلّی

اگر بخواهید پیش از ارسال پروژه به هروکو صفحه‌های خطا را مانند قبل در سیستم خود ببینید باید ابتدا در تنظیمات محلّی خود DEBUG=False را اعمال کنید تا صفحه‌های اشکال‌زدایی پیش‌فرض جانگو غیرفعّال شوند. برای این کار تغییر زیر را در settings.py اعمال کنید (مطمئن شوید روی بخشی از settings.py کار می‌کنید که به محیط محلّی مربوط است نه بخشی که به هروکو ارتباط دارد):

1
2
3
4
--snip--
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
--snip--

حال یک موضوع یا مطلب را که به شما مربوط نیست درخواست کنید تا صفحه‌ی خطای 404 را ببینید. برای امتحان صفحه‌ی خطای 500 موضوع یا مطلبی را درخواست کنید که وجود ندارد. برای مثال آدرس http://localhost:8000/topics/999 باید یک خطای 500 ایجاد کند مگر این که قبلاً ۹۹۹ موضوع آزمایشی ایجاد کرده باشید!

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

نکته
صفحه‌ی خطای 500 هیچ اطّلاعاتی درباره‌ی کاربری که وارد شده نمی‌دهد چون جانگو هنگامی که خطای سرور رخ می‌دهد در پاسخ هیچ اطّلاعاتی درباره‌ی بستر ارتباط نمی‌فرستد.

انتقال تغییرات به هروکو

حال باید تغییراتی که در صفحه‌های خطا ایجاد کرده‌ایم اعمال و آن را به سرور هروکو بفرستیم:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
(ll_env)learning_log$ git add .

(ll_env)learning_log$ git commit -am "Added custom 404 and 500 error pages."
 3 files changed, 15 insertions(+), 10 deletions(-)
  create mode 100644 templates/404.html
  create mode 100644 templates/500.html

(ll_env)learning_log$ git push heroku master
--snip--
remote: Verifying deploy.... done.
To https://git.heroku.com/learning-log.git
    d5075a1..4bd3b1c master -> master

(ll_env)learning_log$

فرمان git add . را در ۱ صادر می‌کنیم زیرا چند فایل جدید به پروژه اضافه کرده‌ایم و باید به گیت بگوییم که آن‌ها را ردگیری کند. سپس در ۲ تغییرات را اعمال و در ۳ پروژه‌ی به‌روزشده را به هروکو می‌فرستیم.

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